Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Andrey Sapozhnikov                   2:5020/400     02 Oct 2003  19:03:05
 To : Sergey Skvortsov
 Subject : Re: Malformed UTF-8 character
 -------------------------------------------------------------------------------- 
 
 Sergey Skvortsov wrote:
 
 > Alexey Mahotkin пишет:
 > SS>> какой-то участок кода хочет видеть переменную
 > $var как utf8.
 > 
 > AM> Это как, кстати?
 > 
 > да как угодно.
 > например если $a - обычный (не-utf8) scalar, $b -
 > utf8 scalar, то при
 > $a.=$b
 > $a сначала апгрейдится до utf8 и лишь после
 > собственно делается join.
 
 Собственно апгрейд иногда делается даже если
 никто не собирается что-либо изменять. Hапример
 при сравнении строк в том числе и неявном, т.е.
 не только вызваным операторами eq/ne/lt/gt/le/ge/cmp.
 
 В perl5.8 есть два пути апгрейда строк в utf8. Штатно
 все макросы (SvPVutf8, SvPVutf8_nolen, SvPVutf8_force,
 SvPVutf8x_force и т.п.) и функции (sv_pvutf8n,
 sv_pvutf8n_force, sv_utf8_upgrade и т.п.) приводят
 в функцию sv_utf8_upgrade_flags. В этой функции и
 происходит ветвление на два возможных пути. Если
 установлена переменная PL_encoding (для программистов
 на Перл не заглядывающих внутрь интерпретатора поясняю:
 эта переменная видна Вам как ${^ENCODING} (см. perldoc
 perlvar) и обычно выставляется не руками, а через
 use encoding (perldoc encoding)), то апгрейд из
 определенной в PL_encoding кодировки осуществляется
 путем вызова метода decode (см. perldoc Encode). Если
 же PL_encoding не определен - апгрейд осуществляется
 через функцию bytes_to_utf8 которая считает исходную
 строку представленой в ISO8859-1 (либо для EBCDIC систем
 приводит к таковой). Есть еще одна забавная переменная
 PL_wantutf8 которая устанавливается в true когда
 интерпретатор при запуске решает, что он работает в
 системе для которой стандартной является utf-8
 кодировка (выискивая подстроку utf-?8 в ряде переменных
 окружения и nl_langinfo(CODEST) (man ml_langinfo)).
 Вот с этой переменной и наиболее вероятна разница
 в поведении. Если она установлена, то дефолтной кодировкой
 потоков STDIN, STDOUT, STDERR становится utf-8 (см. perldoc
 -f binmode)и переменная ${^OPEN} (см. perldoc perlvar)
 устанавливается в ":utf8\0:utf8".
 
 -- 
 Андрей
 
 P.S. Обратим внимание - _нигде_ и _никогда_ перл
 не апгрейдит строки в utf-8 из кодировки текущей
 локали. Если вы только сами не установили use
 encoding в значение кодировки текущей локали.
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Malformed UTF-8 character   Alexander Kostiuchenko   28 Sep 2003 01:39:57 
 Re: Malformed UTF-8 character   Alexey Mahotkin   30 Sep 2003 09:08:38 
 Re: Malformed UTF-8 character   Sergey Skvortsov   30 Sep 2003 15:30:28 
 Re: Malformed UTF-8 character   Alexey Mahotkin   01 Oct 2003 23:31:28 
 Re: Malformed UTF-8 character   Sergey Skvortsov   02 Oct 2003 16:14:06 
 Re: Malformed UTF-8 character   Andrey Sapozhnikov   02 Oct 2003 19:03:05 
 Re: Malformed UTF-8 character   Sergey Skvortsov   06 Oct 2003 16:04:59 
Архивное /ru.perl/65779eedf1b3.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional