![在 Windows 批处理脚本中将文本文件从 ansi 转换为 UTF-8](https://linux22.com/image/1528053/%E5%9C%A8%20Windows%20%E6%89%B9%E5%A4%84%E7%90%86%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%B0%86%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%BB%8E%20ansi%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%20UTF-8.png)
我们有一个默认为 ANSI 格式的文本文件,需要将其转换为 UTF-8 格式。我们有没有办法使用常规 Windows DOS 命令来转换文件?我们可以使用 PowerShell,但只有此命令行必须从不同的批处理进程运行。
答案1
PowerShell 语法相当简单。此命令以默认编码打开文件并将其保存为带 BOM 的 UTF-8:
Get-Content <SrcFile.txt> -Encoding Oem | Out-File <DestFile.txt> -Encoding utf8
该Encoding
参数接受以下内容:Ascii, BigEndianUnicode, BigEndianUTF32, Byte, Default, Oem, String, Unicode, Unknown, UTF32, UTF7, UTF8
答案2
Get-Content 可能不是最佳选择,因为它逐行处理输入文件(至少默认情况下,如果您不使用Raw
后面描述的开关),并且可能会导致更改行尾(例如,如果您在 Unix 和 Windows 系统之间移动文本文件)。我在一个脚本中遇到了严重的问题,就是因为这个原因,花了大约一个小时才找到确切的原因。有关更多信息,请参阅这个帖子。由于这种行为,如果性能很重要的话,Get-Content 也不是最好的选择。
除此之外,您还可以将 PowerShell 与 .NET 类结合使用(只要您的系统上安装了某个版本的 .NET Framework):
$sr = New-Object System.IO.StreamReader($infile)
$sw = New-Object System.IO.StreamWriter($outfile, $false, [System.Text.Encoding]::Default)
$sw.Write($sr.ReadToEnd())
$sw.Close()
$sr.Close()
$sw.Dispose()
$sr.Dispose()
或者更简单地使用Raw
如下描述的开关这里为了避免这种开销并在单个块中读取文本:
Get-Content $inFile -Raw