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




