On 01/16/2014 03:37 PM, [email protected] 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
[email protected]
http://mail.pm.org/mailman/listinfo/kiev-pm

_______________________________________________
Kiev-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/kiev-pm

Ответить