Perl & Unicode

2,657 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,657
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Perl & Unicode

  1. 1. Perl и Unicode<br />Олег Алистратов<br />Perl Mova– 2010<br />
  2. 2. Зачем нужен Unicode?<br />
  3. 3. Unicode в .ru<br />100 000 случайных сайтов<br />Top 350*сайтов<br />* По данным GoalEurope / Rating of Russian Web 2.0 Companies 2008<br />
  4. 4. История<br />
  5. 5. Трафик: text/plain<br />Увеличение размера кириллического текста на 79%<br />
  6. 6. Трафик: text/html<br />Увеличение размера HTML с русским текстом на 14%<br />Медианный размер 100 тыс. случайно выбранных русскоязычных страниц <br />
  7. 7. Трафик: gzipped<br />
  8. 8. Производительность: платформы<br />Mobile Intel® Celeron® 560 @ 2.13 GHz, RAM 1 GbMicrosoft® Windows® XP SP3ActiveState Perl v5.10.0<br />Intel® Core™2 Duo E7400 @ 2.80 GHz, RAM 2 GbUbuntu 9.10 Karmic Koala linux 2.6.31-14-serverperl v5.10.0<br />Intel® Xeon® E5450 @ 3.00 GHz ×2, RAM 32 GbFreeBSD® 6.2-RELEASE-p3perl v5.8.8<br />
  9. 9. Строковые функции<br />107%<br />112%<br />105 … 172%<br />
  10. 10. Регулярные выражения<br />120…600%<br />115%<br />2100...6500%<br />
  11. 11. Регулярные выражения<br />use re 'debug';<br />$a =~ /d/;<br />DIGIT<br />$a =~ /[0-9]/;<br />ANYOF[0-9]<br />$a =~ /(?:0|1|2|3|4|5|6|7|8|9)/;<br />TRIEC-EXACT[0-9]<br />
  12. 12. Исходный файл в UTF-8<br />{<br />use utf8;<br />my $a = 'Привет!';<br />print length($a), " ";<br />}<br />> 7<br />{<br />no utf8;<br />my $a = 'Привет!';<br />print length($a), " ";<br />}<br />> 13<br />
  13. 13. Символы и байты<br />use utf8; # or use encoding "cp1251";<br />my $a = 'Привет!';<br />print length($a), " ";<br />use bytes;<br />print length($a), " ";<br />> 7<br />> 13<br />use encoding::warnings 'FATAL';<br />
  14. 14. Исключения<br />chdir, chmod, chown, chroot, exec, link, lstat, mkdir, rename, rmdir, stat, symlink, truncate, unlink, utime, -X<br />%ENV<br />glob (<*>)<br />open, opendir, sysopen<br />qx/…/, system<br />readdir, readlink<br />
  15. 15. Encode<br />use utf8;<br />use Encode;<br />my $x = 'a -> b';<br />$x = Encode::encode(<br /> 'windows-1251', <br /> $x, <br /> Encode::FB_HTMLCREF<br /> );<br />print $x, " ";<br />> a → b<br />
  16. 16. Символы<br />my $copy = "x00a9"; <br />my $copy = "x{00a9}"; <br />my $copy = pack('U', 0x00a9);<br />print $copy;<br />> ©<br />
  17. 17. Регулярные выражения<br />my $copy = '©';<br />$copy =~ /x{00a9}/;<br />$copy !~ /p{Uppercase}/;<br />$copy =~ /p{Other_Symbol}/;<br />$copy =~ /p{InLatin-1_Supplement}/;<br />$copy !~ /p{InCyrillic}/;<br />$copy !~ /p{BidiClass:R}/;<br />
  18. 18. IO<br />open(my $fh, "<:utf8", "file.txt");<br />open(my $fh, "<:encoding(UTF-8)", "file.txt");<br />open(my $fh, "<:encoding(cp1251)", "file.txt");<br />binmode(STDOUT, ":utf8");<br />RTFM Encode::Supported<br />
  19. 19. LWP<br />use LWP::UserAgent;<br />my $ua = LWP::UserAgent->new;<br />my $response = $ua->get("http://example.com");<br />if ($response->is_success) {<br />my $content = $response->decoded_content;<br />if (defined($content)) {<br /> # ...<br /> }<br />}<br />
  20. 20. Базы данных<br />MySQL<br />$dbh->do('SET NAMES utf8');<br />$dbh->{mysql_enable_utf8} = 1;<br />PostgreSQL<br />$dbh->do("SET client_encoding TO 'UTF8'");<br />$dbh->{pg_enable_utf8} = 1;<br />SQLite<br />$dbh->{sqlite_unicode} = 1;<br />
  21. 21. Конвертация БД<br />$mysqldumpdb_name > dump.sql<br />$iconv -f cp1251 -t utf-8 dump.sql > newdump.sql<br />$sed -i .bak "s/cp1251/utf8/" newdump.sql<br />$mysql < newdump.sql<br />
  22. 22. perl 5.12<br />Расширена поддержка классов и свойста символов до стандартаUnicode 5.2.0<br />usecharnames':full';<br />print"N{GREEK SMALL LETTER ALPHA}"<br />
  23. 23. Спасибо!<br />Олег Алистратов<br />http://alienator.ya.ru http://clubs.ya.ru/regexp/<br />

×