小编bfh*_*h47的帖子

在Windows中通过命令行将UTF-16 LE转换为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”),这会产生损坏的输出。

总结一下:

我正在寻找一种命令行工具/方法(开放或专有,第一方或第三方),以便能够实现如下转换:

  1. UTF-16 LE - …

windows-7 encoding unicode command-line utf-8

6
推荐指数
1
解决办法
6064
查看次数

标签 统计

command-line ×1

encoding ×1

unicode ×1

utf-8 ×1

windows-7 ×1