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

2 ответа2

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

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .