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

Vladimir Timofeev vovkasm на gmail.com
Вт Апр 5 00:57:59 PDT 2011


Привет!
Вот смотрите (консоль на utf-8, perl-5.12.2):
$ echo 'Часы мужские CHARMEX VIENNA CH 2031 ― Самые Модные Часы' |
perl -MEncode -E 'my $str = <>; say
encode("cp1251",decode("utf-8",$str));' | iconv -f cp1251 -t utf8
Часы мужские CHARMEX VIENNA CH 2031 ? Самые Модные Часы

Т.е. в 5.12.2 это работает ;-)

2011/4/5 Mike Salnikov <msalnikov на parallels.com>
>
> >> А если 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{ sprintf "<U+%04X>", shift });
>
>
>
> посмотрим на результат. Если строчка станет читаемой по-русски – меняешь 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> написал:
>
> А если 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 на pm.org [mailto:moscow-pm-bounces+msalnikov=parallels.com на pm.org] On Behalf Of Денис Ильиных
> Sent: Tuesday, April 05, 2011 1:02 PM
> To: 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 | http://moscow.pm.org
>
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



--
Vladimir Timofeev <vovkasm на gmail.com>


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