[Moscow.pm] Очень плохая музыка с UTF-8

Mike Salnikov msalnikov на parallels.com
Вт Апр 5 00:39:29 PDT 2011


>> А если encode('cp1251', $text, 1)?
> "\x{2015}" does not map to cp1251 at /usr/local/lib/perl5/5.10.1/mach/Encode.pm line 158.
> Мне кажется что проблема в том что некоторые символы не могут быть перекодированы в cp1251 потому ничего
> не происходит

Ага
U+2015

―

e2 80 95

HORIZONTAL BAR


Не знает она как эту «тире» в ср1251 сконвертить.
Однако, дока нам намекает, что конвертирование при этом вроде не должно было покосячить остальные символы:
“If CHECK is 0, (en|de)code will put a substitution character in place of a malformed character...”

Попробуй подставить свой обработчик левых символов:
http://perldoc.perl.org/5.10.1/Encode.html#coderef-for-CHECK

что-то типа:
encode("cp1251", $text, sub<http://perldoc.perl.org/5.10.1/functions/sub.html>{ sprintf<http://perldoc.perl.org/5.10.1/functions/sprintf.html> "<U+%04X>", shift<http://perldoc.perl.org/5.10.1/functions/shift.html> });

посмотрим на результат. Если строчка станет читаемой по-русски – меняешь sprintf по вкусу.
Если нет – истина где-то глубже...

----
Mike Salnikov
Parallels

From: moscow-pm-bounces+msalnikov=parallels.com на pm.org [mailto:moscow-pm-bounces+msalnikov=parallels.com на pm.org] On Behalf Of Денис Ильиных
Sent: Tuesday, April 05, 2011 1:54 PM
To: Moscow.pm group
Subject: Re: [Moscow.pm] Очень плохая музыка с UTF-8

По советам сделал следующее

перекодирую так
my $cv = Text::Iconv->new("utf-8", "cp1251");
$text = $cv->convert($str);
ошибок нет вывод просто пустой.

По вашим советам
utf8::is_utf8($str) => 1;

my $utf8 = pack 'C*', unpack 'U0C*',$str;
--- Часы мужские CHARMEX VIENNA CH 2031 ― Самые Модные Часы

my $utf8 = pack 'U0C*', unpack 'C*',$str;
--- "'0AK <C6A:85 CHARMEX VIENNA CH 2031 \x15 !0<K5 \x1c>4=K5 '0AK"

А если encode('cp1251', $text, 1)?
"\x{2015}" does not map to cp1251 at /usr/local/lib/perl5/5.10.1/mach/Encode.pm line 158.
Мне кажется что проблема в том что некоторые символы не могут быть перекодированы в cp1251 потому ничего не происходит


Более подробно.
Я собираю заголовки сайтов.
LWP -> $tree = HTML::TreeBuilder->new_from_content($response->decoded_content);
$title = $tree->look_down(_tag=>"title");
my $ntitle = $title->as_text;

Ошибка на сайте
--- GET => http://www.m-m-i.ru/index.php?productID=1181

Это исключение чем правило. Другие заголовки сайтов в UTF-8 обрабатываются корректно.


5 апреля 2011 г. 10:34 пользователь Mike Salnikov <msalnikov на parallels.com<mailto:msalnikov на parallels.com>> написал:
А если encode('cp1251', $text, 1)?
http://perldoc.perl.org/Encode.html#Handling-Malformed-Data

Что говорит is_utf8($text)?

----
Mike Salnikov
Parallels

From: moscow-pm-bounces+msalnikov=parallels.com<http://parallels.com>@pm.org<http://pm.org> [mailto:moscow-pm-bounces+msalnikov<mailto:moscow-pm-bounces%2Bmsalnikov>=parallels.com<http://parallels.com>@pm.org<http://pm.org>] On Behalf Of Денис Ильиных
Sent: Tuesday, April 05, 2011 1:02 PM
To: moscow-pm на pm.org<mailto:moscow-pm на pm.org>
Subject: [Moscow.pm] Очень плохая музыка с UTF-8

Привет мои дорогие )) Помогите разобраться сломал уже весь моск.

Есть строка в UTF-8 о чем нам говорит Encode::Detect::Detector;

Пытаюсь ее перевести в cp1251 в итоге

--- UTF-8 (Encode::Detect::Detector)
--- Часы мужские CHARMEX VIENNA CH 2031 ― Самые Модные Часы (строка)
--- ~  (тут должен был быть текст Text::Iconv )
--- 'Г—Г Г±Г» ìóæñêèå CHARMEX VIENNA CH 2031 ? Ñà ìûå Ìîäíûå Г—Г Г±Г»' (тут текст encode('cp1251',$text))

Причем другие строки которые детектируются как UTF-8 обрабатываются корректно.
Есть подозрение что в строке есть спецсимволы на которых Iconv не срабатывает или строка не UTF-8, ошибается детектор.

perl 5.10.1

--
Moscow.pm mailing list
moscow-pm на pm.org<mailto:moscow-pm на pm.org> | http://moscow.pm.org

----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20110405/0ecc2c07/attachment-0001.html>


Подробная информация о списке рассылки Moscow-pm