Perl или Powershell, как конвертировать из UCS-2 little-endian в utf-8 или выполнить поиск в oneliner вместо regex в файле UCS-2 - PullRequest
0 голосов
/ 07 мая 2019

Я использую Windows ActivePerl, и мне никогда не удается получить преобразование файла с прямым порядком байтов в UCS2 для правильного преобразования в utf-8.Лучшее, что я мог бы узнать, это то, что кажется правильным преобразованием, за исключением того, что первая строка, состоящая из 4 символов, искажена странными китайскими / японскими символами, но остальная часть файла выглядит нормально.

Что я действительно хочу, так это сделать oneliner /поиск / замена регулярного выражения Perl:

perl -pi.bak -e 's/replacethis/withthat/g;' my_ucs2file.txt

Это не сработает, поэтому я попытался сначала посмотреть, может ли Perl выполнить правильное преобразование, и я застрял, я использую:

perl -i.BAKS -MEncode -p -e "Encode::from_to($_, 'UCS-2', 'UTF-8')" My_UCS2file.txt

Я пытался использовать UCS2 или UCS-2LE, но все еще не могу получить правильное преобразование.

Я помню, где-то кто-то должен был удалить пару битов или что-то в начале UCS2 файл, чтобы преобразование работало, но я не помню ...

Когда я попробовал PowerShell, он пожаловался, что не знает UCS2 / UCS-2 ... ??

Ценю любые идеи.Я заметил, что NotePad ++ действительно открывает и распознает его, и я могу редактировать и сохранять в блокноте, но нет возможности командной строки ...

1 Ответ

2 голосов
/ 07 мая 2019

Единственный способ заключаться в том, чтобы полностью избежать perl и просто использовать iconv -f UCS-2LE -t UTF-8 infile > outfile, но я не уверен, доступен ли он в Windows.

Итак, с perl в качестве однострочного:

$ perl -Mopen="IN,:encoding(UCS-2LE),:std" -C2 -0777 -pe 1 infile > outfile
  • -0777 в сочетании с -p читает целые файлы за раз, а не строку за раз, что является одной ошибкой, когда вы ошибаетесь - когда ваши кодовые точки 16 бит, но выРассматривая их как 8-битные, найти разделители строк будет проблематично.
  • -C2 говорит об использовании UTF-8 для стандартного вывода.
  • -Mopen="IN,:encoding(UCS-2LE),:std" говорит, что кодировка по умолчанию для входных потоков, включая стандартный ввод (поэтому он будет работать с перенаправленным вводом непросто файлы), это UCS-2LE.Подробности смотрите в открытой прагме (в скрипте это будет use open IN => ':encoding(UCS-2LE)', ':std';).Говоря о кодировании, другая проблема, с которой вы столкнулись, заключается в том, что UCS-2 является синонимом UCS-2BE.См. Encode :: Unicode для получения подробной информации.

Так что просто считывает файл за раз, конвертирует из UCS-2LE во внутреннюю кодировку perl и печатает его снова какUTF-8.

Если вам не нужно беспокоиться о преобразовании окончания строки Windows,

$ perl -MEncode -0777 -pe 'Encode::from_to($_, "UCS-2LE", "UTF-8")' infile > outfile

также будет работать.


Если вы хотитеВыходной файл должен быть в UCS-2LE, а не просто конвертировать между кодировками:

$ perl -Mopen="IO,:encoding(UCS-2LE),:std" -pe 's/what/ever/' infile > outfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...