|
|
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)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/65779eedf1b3.html, оценка из 5, голосов 10
|