Как преобразовать пакетный файл, хранящийся в utf-8, во что-то, что работает через другой пакетный файл и запустить его
у меня есть программа, которую я использую для создания пакетного файла. Моя проблема в том,что выход программы UTF-8,поэтому,как только какие-либо диакритические метки, такие как é, à, ö, Ä, находятся в моем пакетном файле, это не удается. Кажется, я не могу найти способ конвертировать мои выходные данные ни в что, кроме UTF-8 в программе, которая создает пакетный файл.
так я думал о создании двух файлов Баха. Фактический и другой, который преобразует фактический из UTF-8 в ANSI (кодовая страница Windows 1252 или, возможно, cp 850) , а затем после этого он его исполняет. Конечно, я бы добавил chcp xxxx в качестве первой команды фактического пакетного файла.
Итак, мой вопрос в том, есть ли альтернатива iconv в Windows - или как преобразовать текстовый файл UTF-8 в кодовую страницу windows, используя второй пакетный файл. Есть ли что-нибудь встроенное в Win XP и выше, что я мог бы использовать или есть бесплатный и распространяемый инструмент, который я мог бы использовать для этого?
Примечание:
chcp 65001
не работает для партии файлы.
EDIT 1:
в windows XP я создал два пакетных файла для проверки первого ответа.
1.bat, закодированный в UTF-8 без BOM, содержит:
chcp 1252
cd üöä
2.bat также закодирован в UTF-8 без BOM - но без каких-либо специальных символов содержит:
chcp 1252
type "1.bat" >"ansi_file.bat"
результирующий файл ansi_file.bat создается при выполнении 2.bat по-прежнему будет кодироваться utf-8, а не ANSI.
изменить 2:
упомянутый обратный процесс работ.
chcp 1252
echo ü > ansi.txt
cmd /u /c type ansi.txt > unicode.txt
но ни одна из следующих последующих строк
cmd /a /c type unicode.txt > back2ansi.txt
type unicode.txt > back2ansi_v2.txt
возвращает меня к Анси. Я пробовал это как на Win XP, так и на Win 7. Кто-нибудь может помочь?
Примечание:
Я знаю, как использовать хост сценария Windows и VBS. Я бы хотел избежать зависимости от хоста сценария. Метод VBS подробно описан здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/aa368046%28v=vs.85%29.aspx
EDIT 3:
текстовый файл, созданный с юникодом ü выше, не является utf-8
файл Юникода Windows-HEX:
FC 00 20 00 0D 00 0A 00
UTF-8 без BOM будет HEX:
C3 BC 20 0D 0A
решение VBS, связанное только с формой unicode, но не работает в форме UTF-8. Мне нужно преобразовать UTF-8 в другую кодовую страницу, поэтому даже это, кажется, не работает на меня...
3 ответов
вы заявили, что не хотите полагаться на хост скрипта, но нет собственной пакетной команды, которая может делать то, что вы хотите. Вам придется использовать что-то помимо чисто замес. Хост скрипта является родным для Windows, поэтому я должен думать, что это не будет проблемой.
следующее UTF8toANSI.vbs скрипт преобразует UTF-8 (С или без BOM) в ISO-8859-1 (в основном то же, что и кодовая страница 1252). Он адаптирован из VB6/VbScsript изменить файл / записать файл с кодировкой на ansii.
Option Explicit
Private Const adReadAll = -1
Private Const adSaveCreateOverWrite = 2
Private Const adTypeBinary = 1
Private Const adTypeText = 2
Private Const adWriteChar = 0
Private Sub UTF8toANSI(ByVal UTF8FName, ByVal ANSIFName)
Dim strText
With CreateObject("ADODB.Stream")
.Open
.Type = adTypeBinary
.LoadFromFile UTF8FName
.Type = adTypeText
.Charset = "utf-8"
strText = .ReadText(adReadAll)
.Position = 0
.SetEOS
.Charset = "iso-8859-1"
.WriteText strText, adWriteChar
.SaveToFile ANSIFName, adSaveCreateOverWrite
.Close
End With
End Sub
UTF8toANSI WScript.Arguments(0), WScript.Arguments(1)
сценарий VBS должен быть в вашем текущем каталоге или вашем пути.
пакетный скрипт для преобразования и запуска вашего сценария в кодировке UTF8 может выглядеть примерно так:
@echo off
UTF8toANSI "utf8.bat" "ansi.bat"
ansi.bat
Оригинальный Ответ: ниже мой оригинальный ответ, который работает для UTF-16 С BOM, но не для UTF-8
вывод внутренних команд автоматически преобразуется в ANSI, если вывод передается по конвейеру или перенаправляется в файл.
chcp 1252
type "utf_file.bat" >"ansi_file.bat"
процесс может идти в обратном направлении, если CMD запускается с /U
опция, но, к сожалению, байты заголовка unicode будут отсутствовать. Но, конечно, это не проблема для вашей ситуации.
в Unix я бы использовал инструмент "iconv" для преобразования между кодировками:
iconv --from-code UTF-8 --to-code iso-8859-1 -c inputfile > outputfile
Кажется, что сборка для Windows доступна вhttp://gnuwin32.sourceforge.net/packages/libiconv.htm
вы можете получить много утилит командной строки GNU из GnuWin32. Это включает iconv
(и многое другое):
C:\> iconv.exe -f UTF-8 -t WINDOWS-1252 input.bat > output.bat