如何将存储在utf-8中的batch file转换为通过另一个batch file运行的文件

我有一个程序,我用来创build一个batch file。 我的问题是,该程序的输出是UTF-8,所以一旦任何变音标记如é,à,ö,Ä在我的batch file中失败。 看来我不能找出一种方法来将我的输出转换为任何东西,但在创buildbatch file的程序中的UTF-8。

所以我想创build两个巴赫文件。 实际的一个和另一个将实际的UTF-8转换为ANSI(Windows代码页1252,或者可能是cp 850),然后执行它。 当然我会添加一个chcp xxxx作为实际batch file的第一个命令。

所以我的问题是,在Windows上有iconv的替代scheme – 或者如何使用第二个batch file将UTF-8文本文件转换为Windows代码页。 有没有什么内置的Win XP中,我可以使用,还是有一个免费的和可再发行的工具,我可以用这个?

注意:

chcp 65001 

不适用于batch file。

编辑1:

在Windows XP上,我创build了两个batch file来testing第一个答案。

1.bat编码为UTF-8无BOM包含:

 chcp 1252 cd üöä 

2.bat也编码为UTF-8无BOM – 但没有任何特殊字符包含:

 chcp 1252 type "1.bat" >"ansi_file.bat" 

执行2.bat时创build的结果ansi_file.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 

让我回到ANSI。 我在Win XP和Win 7上都试过。谁能帮忙?

注意:

我知道如何使用Windows脚本宿主和VBS。 我想尽量避免依赖于脚本主机。 VBS方法在此处详细介绍: http : //msdn.microsoft.com/en-us/library/windows/desktop/aa368046%28v=vs.85%29.aspx

编辑3:

上面创build的包含unicode的文本文件不是utf-8

Windows的unicode文件是HEX:

 FC 00 20 00 0D 00 0A 00 

没有BOM的UTF-8将是HEX:

 C3 BC 20 0D 0A 

链接的VBS解决scheme只能使用Unicode格式,但在UTF-8格式上失败。 我需要将UTF-8转换为另一个代码页,所以即使这似乎没有为我工作…

你已经说过你不想依靠脚本宿主,但是没有可以做你想做的本地批处理命令。 你将不得不使用纯粹的批次以外的东西 。 脚本宿主是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 

原始答案: 下面是我的原始答案,适用于带有BOM的UTF-16,但不适用于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

你可以从GnuWin32项目中获得许多GNU命令行工具。 这包括iconv (还有更多):

 C:\> iconv.exe -f UTF-8 -t WINDOWS-1252 input.bat > output.bat