Как исправить ошибку кодировки UTF-8 русскими словами - PullRequest
0 голосов
/ 11 декабря 2018

Мой Perl-скрипт читает из текстового файла, который содержит в основном английские слова ANSI.Но иногда есть русские слова, которые я не могу перевести обратно в UTF-8.

См. Тот же пример (слова в скобках - это перевод на английский):

Êîìïîíåíò (Component)
Àâòîð (Author)
Ãýíäàëüô (Gandalf)
Äàòà ñîçäàíèÿ (Create date): 20-ìàé(may)-2003
Äàòà êîððåêöèè (Last correction Date): 25-ìàð(mar)-2003
Âåðñèÿ (Version): 0.92
Áëàãîäàðíîñòè (Thanks):
Íîâîå â (New in):
Ïîääåðæêà (Support)
Î÷åíü ìíîãî (Very much)

У меня естьпрочитайте таблицу отладки кодировки UTF-8 и попробуйте также следующее

$s='Àâòîð';
from_to($s, "iso-8859-5","utf-8");  
print "$s\n";

my $s = Encode::decode( 'iso-8859-5', 'Àâòîð' );
from_to($s, "iso-8859-5","utf-8");  
print "$s\n";

Я пробовал также cp1252 вместо iso-8859-5, но ничего не помогает.Я пробовал также Encode :: Guess, но результат не помог: iso-8859-5 or cp1251 or koi8-r or iso-8859-1.

Есть идеи, как преобразовать текст "A" в текст кириллицы "автор"?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Ваша последовательность байтов: 0xc0 0xe2 0xf2 0xee 0xf0.Это русское слово «автор» в cp1251.Представление, данное вами, можно получить, если ваше приложение предполагает, что это кодировка cp1252.Теперь вопрос в том, какую кодовую страницу вы хотели бы иметь?Или какая кодовая страница нужна вашему приложению?

Чтобы правильно прочитать файл в cp1251, вы должны использовать конструкцию, подобную этой:

open (my $tmp_h,"<:encoding(cp-1251)", $ARGV[0]) or die $!; 

Это позволяет perl знать, какую кодовую страницу вы используете в вашем файле.И затем, когда вы будете читать файл в строку, это позволит Perl правильно преобразовать значения из cp1251 во внутреннюю форму Perl (UTF-8) и использовать эти строки как угодно без проблем.

Для внутренней формы perl set UTF8флаг, который вы можете проверить с помощью модуля Devel :: Peek.

Я думаю, что использование внутренней формы также даст вам возможность правильно использовать любую строковую операцию и поможет избежать ошибок.

Я бы порекомендовалиспользовать прагму «использовать utf8» в нашем исходном коде.Теперь все литералы в исходном коде будут обработаны как utf8 и автоматически правильно преобразованы во внутреннюю форму.Теперь мы знаем, что наш исходный код находится в UTF8 (и было бы лучше, если бы с BOM, потому что обнаружение BOM обычно является первым, что обычно делают разные IDE и редактор).Позже мы можем открыть другие файлы в любой кодировке, используя конструкцию «<: encoding (....)», получить данные из Интернета, из баз данных и снова убедиться, что данные были преобразованы во внутреннюю форму, правильно проверяя флаг utf8.Имея все это, мы сможем работать со всеми этими данными одним способом, корректно сравнивать строки, использовать регулярные выражения и так далее.</p>

0 голосов
/ 11 декабря 2018

После некоторых попыток я получаю ожидаемый вывод Автор при переключении кодовой страницы консоли (Windows) на 65001 (UTF-8) и декодировании входных данных с Windows-1251:

perl -MEncode -wle "print encode('UTF-8',decode('Windows-1251',shift))" "Àâòîð"

Это говорит о том, что входные данные кодируются как Windows-1251, а декодирование из них должно давать вам буквы кириллицы в Unicode.Чтобы вывести данные в файл, убедитесь, что вы либо задали кодировку при открытии файла (самое простое), либо encode каждая строка соответствует целевой кодировке при выводе (трудно отслеживать):

my $octets = <$input_file>;

my $data = decode('Windows-1251', $octets;
open my $fh, '>:encoding(UTF-8)', $filename
    or die "Couldn't write to $filename: $!";
print $fh decode('Windows-1251', $data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...