bfh*_*h47 6 windows-7 encoding unicode command-line utf-8
(重新编写问题以使其更有用)
我有一个批处理脚本,它将与命令行程序交互,获取它们的输出,然后根据该输出执行决策。
我需要与之交互的程序之一是一个相当老的程序,所以我被它的怪癖所困扰。当我将其输出通过管道传输到文本文件时,该文本文件采用 UTF-16 LE 编码。
我是这样做的:
program -parameter > resultat.txt
Run Code Online (Sandbox Code Playgroud)
在Windows 7下,这种编码对于cmd/批处理工作来说似乎很麻烦,因为你无法将这样的文本文件的内容读入变量。
这是一个示例(仅使用文本文件的第一行):
set /p Var=<resultat.txt
echo %Var%
cmd /k
Run Code Online (Sandbox Code Playgroud)
它只是没有任何回声,说“ECHO 已打开”。
另外,如果您使用“type”来打印文本文件的内容,则会出现奇怪的空格,表明它没有被正确处理。
尝试的解决方案 [1] - Powershell
经过研究,发现powershell可以转换txt编码,使用的方法如下:
Get-Content -Path "path\file.txt" | Out-File -FilePath "path\new_file.txt" -Encoding <encoding>
Run Code Online (Sandbox Code Playgroud)
使用 Notepad++,我做了一些研究,我需要获得什么编码?
UTF-8(无BOM),相当于记事本中的“ANSI”,是我需要的编码,将文本文件加载到变量中,并且“type”命令在使用此编码时都可以完美地工作。我怎么知道?如果我在记事本中打开管道文本文件,然后重新保存为“ANSI”编码,一切都会完美运行。
-Encoding ascii
Run Code Online (Sandbox Code Playgroud)
...这个选项应该有效,因为这会产生 UTF-8(无 BOM)结果,但它似乎无法处理 UTF-16 LE 源编码格式,并且不会产生可用的输出。当我在 Notepad++ 中打开生成的文件时,它将其识别为 UTF-16 LE“Unix”,这很奇怪。
有趣的是:如果我在记事本中将管道 txt 文件重新保存为“unicode”,则会生成一个 UTF-16 LE BOM 文件,该文件与上述转换参数一起生成完美的 UTF-8 文件。此时,我扩展了研究范围,提出了“如何将 BOM 添加到 UTF-16 LE 编码?”的问题。因为我可以将这些知识与 powershell 知识结合起来。然而,剧透警告:我没能找到一个像样的答案。
-Encoding utf8
Run Code Online (Sandbox Code Playgroud)
...是另一个类似的选项,但它会生成 UTF-8 BOM 文件(相当于在记事本中另存为“UTF-8”),这会产生损坏的输出。
总结一下:
我正在寻找一种命令行工具/方法(开放或专有,第一方或第三方),以便能够实现如下转换:
UTF-16 LE - Windows(CR LF) 直接转换为 UTF-8 - Windows(CR LF)
UTF-16 LE - Windows(CR LF) 到 UTF-16 LE BOM - Windows(CR LF)
阻力最小的路径:在 Windows 上使用 libiconv
经过大约一天的搜索(当问题被提出时),我注意到 Stackoverflow 有一个名为 [utf16-le] 的标签,我认为值得花时间浏览使用此标签的所有线程。
我找到了一个解决方案,它展示了一个名为“iconv”的程序,甚至是执行转换所需的完整命令。与 powershell 方法不同,您需要准确指定输入编码以及输出编码,但也与 powershell 方法不同,它会产生良好的结果。
这是有用的线程:
iconv 不是 Windows 实用程序,但它显然已移植到 Windows,虽然上面链接的问题是使用 [Linux] 标签提出的,但答案之一包含一个与 Windows 完全兼容的示例:
iconv -f UTF-16LE -t UTF-8 infile > outfile
Run Code Online (Sandbox Code Playgroud)
我从这里下载了文件:
https://sourceforge.net/projects/gnuwin32/files/libiconv/1.9.2-1/
我只需要“bin”(二进制)和“dep”(依赖项),将两者的内容提取到同一个文件夹中,然后就可以开始了。
归档时间: |
|
查看次数: |
6064 次 |
最近记录: |