[Kiev-pm] utf8

vti viacheslav.t at gmail.com
Thu Jan 16 05:55:14 PST 2014


On 01/16/2014 03:37 PM, my.yarnik ÎÁ yandex.ru wrote:
> Здравствуйте, vti.
>
> я  конечно  плохо  знаю  язык  и  в  часности много чего не понимаю, к
> примеру.
>
>> Рекомендации по UTF-8:
>> 1. print должен быть в UTF-8: binmode(STDOUT, ":utf8");
> зачем писать это если оно итак хранится в UTF-8 и выводит в UTF-8
>

Я имел в виду, что по сети все строки передаются как байты, а не как 
символы, т.е. один символ может занимать несколько байт. Таким образом, 
чтобы правильно работать с символами, надо строку пришедшую изве из 
байтового представления преобразовать в символьное. И, наоборот, когда 
передаем данные, необходимо из строки все преобразовать в байты.

my $bytes = read_from_socket();
my $string = Encode::decode('UTF-8', $bytes);
write_to_socket(Encode::encode('UTF-8', $string);
>> 2. glob возвращает файл в байтах, необходимо преобразовать в UTF-8: my
>> $file = Encode::decode('UTF-8', $_);
> вот  все вроде понятно, но "файл в байтах", это же к размеру относится
> а не к названию....
glob возвращает данные в байтовом представлении, потому как исторически 
работало только с ASCII кодировкой. В нашем случае возвращается UTF-8, 
который необходимо преобразовать в строку, чтобы правильно с ней работать.
>
>> 3. при открытии файла необходимо сообщить, что мы хотим автоматически
>> UTF-8: open(FILE, '<:encoding(UTF-8)', "$file");
> что б не менять это везде вручную, я заменил на
> use open qw/:utf8/;
> эффект тот же самый.

Да, можно и так.
>> 4. вместо use encoding 'utf-8' использовать use utf8; и только тогда,
>> когда в исходном тексте программы есть UTF-8 символы (в данном случае есть)
> понял, а еще понятней стало когда носом ткнули в доку где написано что
> оно может быть удалено

Часто use utf8; пихают везде, даже не понимая что оно делает. Поэтому я 
и акцентировал на этом.
>> 5. с базой вижу есть вариант правильный (set names + mysql_enable_utf8),
>> надеюсь, что и в схеме стоит кодировка UTF-8 (иначе будет каша потом)
> тут я экспереметирую, поэтому и создал 2 базы:
> 1. utf c полями утф и вин
> 2. вин с полями утф и вин
> по  сути  все  равно  что  использовать,  самое  главное  обьявить при
> подключении к базе
> $dbh->do("set names utf8");
> $dbh->{mysql_enable_utf8} = 1;
>
>> Сократить этот список можно используя utf8::all.
> не слышал о таком еще..
>
> С уважением,
> Ярослав
>
> _______________________________________________
> Kiev-pm mailing list
> Kiev-pm ÎÁ pm.org
> http://mail.pm.org/mailman/listinfo/kiev-pm



More information about the Kiev-pm mailing list