Как преобразовать пакетный файл, хранящийся в 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