У нас есть текстовый файл в формате ANSI по умолчанию, который необходимо преобразовать в формат UTF-8. Есть ли способ, которым мы можем использовать общие команды Windows DOS для преобразования файла? Мы можем использовать PowerShell, но только эта командная строка должна запускаться из другого пакетного процесса.
2 ответа
Синтаксис PowerShell довольно прост. Эта команда открывает файл в кодировке по умолчанию и сохраняет его как 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
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