Perl, HTML-данные и символы, закодированные в utf-8 - PullRequest
2 голосов
/ 13 сентября 2011

Новичок в Perl.

Я создал Perl-скрипт, который анализирует данные с html-сайта.Мой сценарий кодирует данные в UTF-8, один из данных содержит румынские символы, поэтому кодирование данных приводит к неправильным символам, таким как:

ţ = þ (incorrect); ş = º (incorrect); ă = ã (correct);

пример строки для анализа из html:

Distribuţia: Robert Downey Jr. (Sherlock Holmes) Jude Law (Dr. John Watson) Rachel McAdams (Irene Adler) Mark Strong (Lord Blackwood) Kelly Reilly (Mary Morstan) Eddie Marsan (Inspectorul Lestrade) James Fox (Sir Thomas)

Я хочу разделить это на:

my ($credits, $line)
foreach $credits (split /(?=\w+:)\s*/, $line) {
...

, но вывести, потому что "þ" интерпретируется как "несловесный символ" (здесь разрывы строк некорректны):

Distribuþ
Robert Downey Jr. (Sherlock Holmes)
Jude Law (Dr. John Watson)
Rachel McAdams (Irene Adler)
Mark Strong (Lord Blackwood)
Kelly Reilly (Mary Morstan)
Eddie Marsan (Inspectorul Lestrade)
James Fox (Sir Thomas)

Требуемый вывод (правильный):

Distribuţia
Robert Downey Jr. (Sherlock Holmes)
Jude Law (Dr. John Watson)
Rachel McAdams (Irene Adler)
Mark Strong (Lord Blackwood)
Kelly Reilly (Mary Morstan)
Eddie Marsan (Inspectorul Lestrade)
James Fox (Sir Thomas)

если я использую переменную "\ p {Alpha}" вместо "\ w", частично решить проблему (строка переносится правильно, но отображается " Распределение"вместо" Распространение", вероятно, происходит с другим персонажем) выглядит следующим образом (неверно):

Distribuþia
Robert Downey Jr. (Sherlock Holmes)
Jude Law (Dr. John Watson)
Rachel McAdams (Irene Adler)
Mark Strong (Lord Blackwood)
Kelly Reilly (Mary Morstan)
Eddie Marsan (Inspectorul Lestrade)
James Fox (Sir Thomas)

Ответы [ 4 ]

4 голосов
/ 13 сентября 2011

Текст :: Unidecode

>perl -MText::Unidecode -E"say unidecode qq{rom\x{00E2}n\x{0103}}"
romana
3 голосов
/ 13 сентября 2011

Просто держите все в utf-8.

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

Гораздо проще оставить все как utf-8 и позволить магии случиться.

2 голосов
/ 27 июля 2013

þ - это символ Latin-1 , который имеет то же значение байта, что и символ Latin-10 ț. Похоже, вы не указываете правильную кодировку символов при чтении в строке. Предположительно, веб-страница, которую вы анализируете, использует Latin-10, но вы читаете ее в Perl без указания кодировки ввода-вывода.

Если это так, вы должны указать Perl кодировку символов при открытии файла:

open my $fh, '<:encoding(ISO-8859-16)', $file);

или если у вас нет контроля над открытым файлом и вы хотите исправить строку, вы можете преобразовать его с помощью:

use Encode;
Encode::decode('ISO-8859-16', $str);

Оба подхода преобразуют данные во внутренний строковый формат, поддерживающий Unicode, вместо байтов Latin-1.

Обратите внимание, что вам также может потребоваться исправить вывод, чтобы кодировать данные в формате UTF-8 или Latin-10 в зависимости от ваших потребностей.

0 голосов
/ 13 сентября 2011

Простой y /// перед декодированием может это сделать (если ваши данные и источник находятся в формате utf)

my $data = yadayada;
$data =~ tr/áéíóúçãõñ/aeioucaon/;

Покажите нам какой-нибудь фактический код:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...