You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows命令行下将UTF-16 LE(无BOM)文件转换为UTF-8(无BOM)的解决方案

Windows命令行下将UTF-16 LE(无BOM)文件转换为UTF-8(无BOM)的解决方案

我完全懂你的困扰——老程序输出的无BOM UTF-16 LE文件在Windows cmd里简直是“麻烦制造者”,不管是读进变量还是用type命令都异常。结合你尝试过的PowerShell思路,我整理了几个靠谱的原生解决方案,不用装第三方工具:

方法一:PowerShell直接转换(推荐,适用于PowerShell 5.1及以上)

你之前的问题出在没指定源文件的编码,PowerShell默认识别不了无BOM的UTF-16 LE,导致读取内容就出错了。只要明确指定源编码,再输出成无BOM的UTF-8即可:

Get-Content -Path "resultat.txt" -Encoding UTF16 | Out-File -FilePath "new_resultat.txt" -Encoding UTF8NoBOM -NewLine CRLF
  • -Encoding UTF16:告诉PowerShell源文件是UTF-16 LE(不管有没有BOM都能正确读取)
  • -Encoding UTF8NoBOM:直接输出无BOM的UTF-8文件,正好匹配你需要的Notepad“ANSI”等价格式
  • -NewLine CRLF:强制用Windows风格的换行符,避免转换成Unix换行

方法二:兼容旧版PowerShell的写法

如果你的PowerShell版本低于5.1(比如Windows 7自带的2.0版本),没有UTF8NoBOM参数,可以用.NET类实现:

# 读取无BOM的UTF-16 LE文件
$fileContent = Get-Content -Path "resultat.txt" -Encoding UTF16
# 写入无BOM的UTF-8文件,指定Windows换行
[System.IO.File]::WriteAllLines("new_resultat.txt", $fileContent, [System.Text.UTF8Encoding]::new($false))

这里[System.Text.UTF8Encoding]::new($false)就是生成不带BOM的UTF-8编码。

方法三:先给UTF-16 LE文件加BOM(对应你之前的思路)

如果你还是想用“加BOM后转换正常”的路子,也可以用PowerShell给无BOM的UTF-16 LE文件添加BOM,再转UTF-8:

# 读取文件字节
$bytes = Get-Content "resultat.txt" -Encoding Byte
# 插入UTF-16 LE的BOM(0xFF 0xFE)
$bomBytes = [byte[]]@(0xFF, 0xFE)
$newBytes = $bomBytes + $bytes
# 写回带BOM的UTF-16 LE文件
Set-Content "resultat_with_bom.txt" -Encoding Byte -Value $newBytes
# 再转成无BOM的UTF-8
Get-Content "resultat_with_bom.txt" -Encoding Unicode | Out-File "new_resultat.txt" -Encoding UTF8NoBOM -NewLine CRLF

不过这个方法多了一步,不如前两种直接。

验证转换结果

转换完成后,用Notepad++打开new_resultat.txt,查看编码应该是UTF-8(无BOM),换行符是Windows(CR LF)。之后在cmd里测试:

set /p Var=<new_resultat.txt
echo %Var%

这时候就能正常输出内容,type命令也不会出现奇怪的空格了。

备注:内容来源于stack exchange,提问作者bfh47

火山引擎 最新活动