|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 31 Jan 2008 00:59:51 To : Dmitry E. Oboukhov Subject : Re: и снова о юникоде -------------------------------------------------------------------------------- Dmitry E. Oboukhov -> Artem Chuprina @ Wed, 30 Jan 2008 21:29:24 +0300: DEO>>> разобрался AB>>>> Можно сделать так: AB>>>> # Тут у тебя $content будет с зажженным флагом. AB>>>> $content = decode('koi8-r', $content, Encode::FB_QUIET); DEO>>> нет тут дело оказалось не в флагах а в том что юникод на вебстраницах DEO>>> передается не в utf-8, а в utf-16LE DEO>>> в итоге регвыражение получилось такое: DEO>>> use Encode qw(encode decode); DEO>>> ... DEO>>> $str=~s/\&\#(\d{4})\;/encode('utf-8', decode('utf-16LE', pack('S', DEO>>> $1)))/eg; AC>> Это на каких веб-страницах он так передается!? DEO> на всех DEO> яндекс например DEO> а что? Говорит, charset=windows-1251. А, понял. Hе, мужик, не в UTF-16LE. А вовсе даже просто в уникоде. Который _на твоем писюке_ _после этого pack_ на _буквах, используемых яндексом_ будет представлен так же, как UTF-16LE. А на самом деле эти числа означают уникодовские коды символов, не привязанные ни к какой кодировке. И надо сказать, цифр там будет совершенно не обязательно ровно четыре... В принципе, за крайне редко встречающемся на практике исключением, прием будет работать. Если не хотеть ровно четыре цифры и паковать не с 'S', а с 'v'. Hо вообще копать в сторону 'U' было бы более правильно. Во всяком случае, замена decode('utf-16LE', pack('S', $1)) на pack("U", $1) у меня успешно сработала. -- Artem Chuprina RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru Он был новичком в Париже, а не в фехтовании. Alexander Mozhaev в <1053722458@p15.f76.n5026.z2.fidonet.ftn> --- ifmail v.2.15dev5.4 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/31444dcf0293a.html, оценка из 5, голосов 10
|