6

我有一个用来创建批处理文件的程序。我的问题是程序的输出是 UTF-8,所以只要像 é,à,ö,Ä 这样的变音符号出现在我的批处理文件中,它就会失败。似乎我无法在创建批处理文件的程序中将输出转换为除 UTF-8 之外的任何内容。

所以我正在考虑创建两个 bach 文件。实际的一个和另一个将实际的从 UTF-8 转换为 ANSI(Windows 代码页 1252,或者可能是 cp 850),然后在此之后执行它。当然,我会添加一个 chcp xxxx 作为实际批处理文件的第一个命令。

所以我的问题是 Windows 上是否有 iconv 的替代方法 - 或者如何使用第二个批处理文件将 UTF-8 文本文件转换为 Windows 代码页。Win XP 及更高版本中是否有任何我可以使用的内置工具,或者是否有我可以使用的免费和可再分发工具?

笔记:

chcp 65001

不适用于批处理文件。

编辑1:

在 Windows XP 上,我创建了两个批处理文件来测试第一个答案。

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

chcp 1252
cd üöä

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

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

执行 2.bat 时创建的结果 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 Script Host 和 VBS。我想避免依赖脚本主机。VBS方法在这里详细介绍:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa368046%28v=vs.85%29.aspx

编辑 3:

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

Windows unicode 文件是 HEX:

FC 00 20 00 0D 00 0A 00

没有 BOM 的 UTF-8 将是 HEX:

C3 BC 20 0D 0A

链接到的 VBS 解决方案仅适用于 unicode 表单,但在 UTF-8 表单上失败。我需要将 UTF-8 转换为另一个代码页,所以即使那个似乎不适合我......

4

3 回答 3

11

您已声明您不想依赖脚本主机,但没有本机批处理命令可以执行您想要的操作。您将不得不使用纯批处理之外的东西。脚本宿主是 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 标头字节将丢失。但当然,这对您的情况来说不是问题。

于 2012-10-29T22:02:28.960 回答
7

在 Unix 中,我会使用“iconv”工具在编码之间进行转换:

iconv --from-code UTF-8 --to-code iso-8859-1 -c inputfile > outputfile

似乎可以在 http://gnuwin32.sourceforge.net/packages/libiconv.htm获得适用于 Windows 的构建

于 2012-11-03T10:35:12.153 回答
0

您可以从GnuWin32项目中获得许多 GNU 命令行实用程序。这包括iconv(以及更多):

C:\> iconv.exe -f UTF-8 -t WINDOWS-1252 input.bat > output.bat
于 2012-11-03T10:43:05.433 回答