Perl и Unicode Олег Алистратов Perl Mova – 2010

Содержание

Слайд 2

Зачем нужен Unicode?

Зачем нужен Unicode?

Слайд 3

Unicode в .ru 100 000 случайных сайтов Top 350* сайтов *

Unicode в .ru

100 000 случайных сайтов

Top 350* сайтов

* По данным GoalEurope

/ Rating of Russian Web 2.0 Companies 2008
Слайд 4

История

История

Слайд 5

Трафик: text/plain Увеличение размера кириллического текста на 79%

Трафик: text/plain

Увеличение размера кириллического текста на 79%

Слайд 6

Трафик: text/html Увеличение размера HTML с русским текстом на 14% Медианный

Трафик: text/html

Увеличение размера HTML с русским текстом на 14%
Медианный размер 100

тыс. случайно выбранных русскоязычных страниц
Слайд 7

Трафик: gzipped

Трафик: gzipped

Слайд 8

Производительность: платформы Mobile Intel® Celeron® 560 @ 2.13 GHz, RAM 1

Производительность: платформы

Mobile Intel® Celeron® 560 @ 2.13 GHz, RAM 1 Gb Microsoft®

Windows® XP SP3 ActiveState Perl v5.10.0
Intel® Core™2 Duo E7400 @ 2.80 GHz, RAM 2 Gb Ubuntu 9.10 Karmic Koala linux 2.6.31-14-server perl v5.10.0
Intel® Xeon® E5450 @ 3.00 GHz × 2, RAM 32 Gb FreeBSD® 6.2-RELEASE-p3 perl v5.8.8
Слайд 9

Строковые функции

Строковые функции

Слайд 10

Регулярные выражения

Регулярные выражения

Слайд 11

Регулярные выражения use re 'debug'; $a =~ /\d/; DIGIT $a =~

Регулярные выражения

use re 'debug';
$a =~ /\d/;
DIGIT
$a =~ /[0-9]/;
ANYOF[0-9]
$a =~ /(?:0|1|2|3|4|5|6|7|8|9)/;
TRIEC-EXACT[0-9]

Слайд 12

Исходный файл в UTF-8 { use utf8; my $a = 'Привет!';

Исходный файл в UTF-8

{
use utf8;
my $a = 'Привет!';
print

length($a), "\n";
}
> 7
{
no utf8;
my $a = 'Привет!';
print length($a), "\n";
}
> 13
Слайд 13

Символы и байты use utf8; # or use encoding "cp1251"; my

Символы и байты

use utf8; # or use encoding "cp1251";
my $a =

'Привет!';
print length($a), "\n";
use bytes;
print length($a), "\n";
> 7
> 13
use encoding::warnings 'FATAL';
Слайд 14

Исключения chdir, chmod, chown, chroot, exec, link, lstat, mkdir, rename, rmdir,

Исключения

chdir, chmod, chown, chroot, exec, link, lstat, mkdir, rename, rmdir, stat,

symlink, truncate, unlink, utime, -X
%ENV
glob (<*>)
open, opendir, sysopen
qx/…/, system
readdir, readlink
Слайд 15

Encode use utf8; use Encode; my $x = 'a → b';

Encode

use utf8;
use Encode;
my $x = 'a → b';
$x = Encode::encode(
'windows-1251',


$x,
Encode::FB_HTMLCREF
);
print $x, "\n";
> a → b
Слайд 16

Символы my $copy = "\x00a9"; my $copy = "\x{00a9}"; my $copy

Символы

my $copy = "\x00a9";
my $copy = "\x{00a9}";
my $copy =

pack('U', 0x00a9);
print $copy;
> ©
Слайд 17

Регулярные выражения my $copy = '©'; $copy =~ /\x{00a9}/; $copy !~

Регулярные выражения

my $copy = '©';
$copy =~ /\x{00a9}/;
$copy !~ /\p{Uppercase}/;
$copy =~ /\p{Other_Symbol}/;
$copy

=~ /\p{InLatin-1_Supplement}/;
$copy !~ /\p{InCyrillic}/;
$copy !~ /\p{BidiClass:R}/;
Слайд 18

IO open(my $fh, " open(my $fh, " open(my $fh, " binmode(STDOUT, ":utf8"); RTFM Encode::Supported

IO

open(my $fh, "<:utf8", "file.txt");
open(my $fh, "<:encoding(UTF-8)", "file.txt");
open(my $fh, "<:encoding(cp1251)", "file.txt");
binmode(STDOUT, ":utf8");
RTFM

Encode::Supported
Слайд 19

LWP use LWP::UserAgent; my $ua = LWP::UserAgent->new; my $response = $ua->get("http://example.com");

LWP

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $response = $ua->get("http://example.com");
if ($response->is_success) {
my

$content = $response->decoded_content;
if (defined($content)) {
# ...
}
}
Слайд 20

Базы данных MySQL $dbh->do('SET NAMES utf8'); $dbh->{mysql_enable_utf8} = 1; PostgreSQL $dbh->do("SET

Базы данных

MySQL
$dbh->do('SET NAMES utf8');
$dbh->{mysql_enable_utf8} = 1;
PostgreSQL
$dbh->do("SET client_encoding TO 'UTF8'");
$dbh->{pg_enable_utf8} = 1;
SQLite
$dbh->{sqlite_unicode}

= 1;
Слайд 21

Конвертация БД $ mysqldump db_name > dump.sql $ iconv -f cp1251

Конвертация БД

$ mysqldump db_name > dump.sql
$ iconv -f cp1251 -t utf-8

dump.sql > newdump.sql
$ sed -i .bak "s/cp1251/utf8/" newdump.sql
$ mysql < newdump.sql
Слайд 22

perl 5.12 Расширена поддержка классов и свойста символов до стандарта Unicode

perl 5.12

Расширена поддержка классов и свойста символов до стандарта Unicode 5.2.0
use charnames

':full';
print "\N{GREEK SMALL LETTER ALPHA}"