«Unicode.
 Ликбез»
Ликбе́з (ликвида́ция
 безгра́мотности)
В переносном смысле —
обучение неподготовленной
аудитории базовым понятиям
какой-либо науки, процесса
или явления.
Упрощенец – тот, кто
поверхностно, не вникая в
суть, подходит к решению
сложных задач, вопросов.
Часть 1

 Задачка, в процессе
  решения которой,
   автор пришел к
  пониманию своего
     невежества
найти в слове
Îñţérñåţîöñåļîžåţîöñ
     подстроку
      Nation
http://stackoverflow.com/questions/
7429964/how-to-match-string-with-
diacritic-in-modern-perl/
7440789#7440789
Решение №1
use 5.014;
use utf8;
use Unicode::Normalize;
binmode STDOUT, ':encoding(UTF-8)';
my $str = "Îñţérñåţîöñåļîžåţîöñ";
my $look = "Nation";
say "before: $strn";
$str = NFD($str);
$str =~ s/pM//og; # remove "marks"
say "after: $str";
say "is_match: ", $str =~ /$look/i || 0;
tchrist:
«This is the wrong
 way to do it. You
need to use a UCA
 match at level 1»
Решение №2
use 5.014;
use utf8;
use Unicode::Collate;
my $str = "Îñţérñåţîöñåļîžåţîöñ";
my $look = "Nation";
my $Collator = Unicode::Collate->new(
   normalization => undef, level => 1
);
my @match = $Collator->match($str, $look);
say “matches: ” . join(“, “, @match);
«Code that assumes you
can remove diacritics to get
 at base ASCII letters is evil,
still, broken, brain-damaged,
 wrong, and justification for
       capital punishment»
?
Часть 2


    Ликбез
 Unicode – это не
кодировка или таблица
символов.
   Это стандарт! В
который входит, кроме
таблиц символов и правил
их кодирования, еще
много-много всего
Стандарт Unicode
таблицы символов, несколько механизмов кодирования

формы нормализации текста

правила casemapping, casefolding

гибкие правила collation

правила переносов для слов и разбиения строк

специальные правила для регулярных выражений

тысячи именованых свойств (properties)

численные эквивалентности (U+216B XII)

направление текста

.... много всего другого ....
TLA (ТБС)
UCS

UTF

BMP

BOM

UCA

NFC, NFD

ICU
UCS (ucs-2, ucs-4)
универсальный набор символов
(англ. UCS, universal character set) 
задаёт однозначное соответствие
символов кодам — элементам
кодового пространства,
представляющим неотрицательные
целые числа.
определен в стандарте ISO/IEC
10646 (включен в стандарт Unicode)
UCS, продолжение...
запись Unicode символов вида: U+0075

пример:
u (U+0075 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴜ) + ¨(U+0308
ᴄᴏᴍʙɪɴɪɴɢ ᴅɪᴀᴇʀᴇsɪs) => ü
mac: unicode hex input (l&t), option + code
windows: alt + “+” + code

www.fileformat.info/info/unicode/char/search.htm
 .../search.htm?q=diacritic&preview=entity
Кодовое пространство (codespace) в
Unicode разбито на 17 плоскостей по 2^16
(65536) code points (кодовых точек)
набор всех code points: 0hex to 10FFFFhex

Нулевая плоскость называется
Basic Multilingual Plane (BMP)
в ней расположены символы наиболее
употребительных письменностей. 
Т.е. это все что в диапазоне 0x0 - 0xFFFF (не
все используются, верхняя часть диапазона
зарезервирована)
Unicode transformation format
    UTF-16BE, UTF-16LE
    UTF-32BE, UTF-32LE
    UTF-8, UTF-EBCDIC

BE (big-endian) – от старшего к младшему
LE (little-endian) – от младшего к старшему

если нет BOM (о нем ниже) то стандартом
предписывается  BE (тупоконечный)
BOM
byte order mark

Важен для UTF-16 и UTF-32. (для
определения тупо/остро-
конечности)
Для UTF-8 обычно не нужео, но
есть в стандарте и часто
используется в Windows. UTF-16,32
программы по BOM могут понять
(если захотят), что в файле utf-8.
UTF-16

включает в себя UCS-2, как
подмножество
особенность кодировки, что
символы не из 0-й plane  задаются
составными кодами 16+16=32 бита
или суррогатными парами
UTF-32

 фиксированной ширины, всегда 4 байта,
UTF-32/UCS-4 requires four bytes to encode
any character. 
http://en.wikipedia.org/wiki/UTF-32/UCS-4
UTF-8
Unix/Web кодировка
2/09/1992 К. Томпсон & Р. Пайк
ASCII-совместима, 1–6 байт (4)
BOM – не нужен!
UTF-EBCDIC – редкая экзотика
для мейнфреймов
character
symbol
grapheme
glypth
letter
diacritical mark
ideogram
Композиция символов –
cимволы задающиеся несколькими кодами.
Для некоторых символов есть как
композитные так и монолитные формы записи
Ё (U+0401) и Й (U+0419), 
Е +  ̈ (U+0415 U+0308)
И +  ̆ (U+0418 U+0306)

Character General Category –
каждый code point относится к одной из
основных категорий.
Буква, знак (см диакр. знаки), число(number),
пунктуационный знак, символ, разделитель
(см. http://www.unicode.org/versions/Unicode6.0.0/ch02.pdf)
Нормализация –
Поскольку одни и те же символы можно
представить различными кодами, что иногда
затрудняет обработку, существуют процессы
нормализации, предназначенные для
приведения текста к определённому
стандартному виду.

Case folding – приведение символа или
строки к заданному регистру (м. б. 1–3)

Collation (UCA)
алгоритм сравнения двух строк, с учетом
особенностей Unicode
ICU
International Components for
Unicode
 набор C-библиотек для
разработки программ с
поддержкой Unicode
Для Python есть pyICU
в Perl5 не используется!
☕
Часть 3


 Домашняя
  работа
Зачем учить?
«Все-таки UTF8
 в перле - это
немного черная
    магия»
 Alex Povolotsky, рассылка
        Moscow.pm
Как учить?
презентации tchrist (OSCON 2011)

утилиты tchrist

http://stackoverflow.com/questions/6162484/
why-does-modern-perl-avoid-utf-8-by-
default/6163129#6163129 

http://local.joelonsoftware.com/wiki/
Абсолютный_Минимум,_который_Каждый_
Разработчик_Программного_Обеспечения_
Обязательно_Должен_Знать_о_Unicode_и_
Наборах_Символов

http://ru.wikipedia.org/wiki/Юникод

http://perldoc.perl.org/search.html?q=perluni
Еще ссылки
http://shapecatcher.com/
http://unicode.org/resources/
online-tools.html (http://
unicodinator.com/)
http://event.perlrussia.org/
saintperl3/talk/158


training.perl.com   ☠☠☠
«возможно, я не смог раскрыть
всё, что надо знать о кодировках
    символов и Unicode, но я
 надеюсь, что если вы не уснули
  до этого места, вы уже знаете
достаточно, чтобы возвратиться
     к программированию и
   использовать антибиотики
вместо пиявок и кровопусканий»
как стать экспертом по
   работе с кодировками
«Encoding is for i/o; in the Perl space, text must be
Perl character strings.
I repeat: Encoding is for i/o; in the Perl space, text
must be Perl character strings.
Write that 100 times, display it next to your
monitor(s), record it and play it whilst sleeping on
your ipod for one week, have it tattooed on your
fingers, and in no time you'll be known as the
encoding guru in your company»
http://sigstp.blogspot.com/

«Unicode. Ликбез»

  • 1.
  • 2.
    Ликбе́з (ликвида́ция безгра́мотности) В переносномсмысле — обучение неподготовленной аудитории базовым понятиям какой-либо науки, процесса или явления.
  • 3.
    Упрощенец – тот, кто поверхностно,не вникая в суть, подходит к решению сложных задач, вопросов.
  • 4.
    Часть 1 Задачка,в процессе решения которой, автор пришел к пониманию своего невежества
  • 5.
  • 6.
  • 7.
    Решение №1 use 5.014; useutf8; use Unicode::Normalize; binmode STDOUT, ':encoding(UTF-8)'; my $str = "Îñţérñåţîöñåļîžåţîöñ"; my $look = "Nation"; say "before: $strn"; $str = NFD($str); $str =~ s/pM//og; # remove "marks" say "after: $str"; say "is_match: ", $str =~ /$look/i || 0;
  • 8.
    tchrist: «This is thewrong way to do it. You need to use a UCA match at level 1»
  • 9.
    Решение №2 use 5.014; useutf8; use Unicode::Collate; my $str = "Îñţérñåţîöñåļîžåţîöñ"; my $look = "Nation"; my $Collator = Unicode::Collate->new( normalization => undef, level => 1 ); my @match = $Collator->match($str, $look); say “matches: ” . join(“, “, @match);
  • 10.
    «Code that assumesyou can remove diacritics to get at base ASCII letters is evil, still, broken, brain-damaged, wrong, and justification for capital punishment»
  • 11.
  • 12.
    Часть 2 Ликбез
  • 13.
     Unicode – этоне кодировка или таблица символов. Это стандарт! В который входит, кроме таблиц символов и правил их кодирования, еще много-много всего
  • 14.
    Стандарт Unicode таблицы символов,несколько механизмов кодирования формы нормализации текста правила casemapping, casefolding гибкие правила collation правила переносов для слов и разбиения строк специальные правила для регулярных выражений тысячи именованых свойств (properties) численные эквивалентности (U+216B XII) направление текста .... много всего другого ....
  • 15.
  • 16.
    UCS (ucs-2, ucs-4) универсальныйнабор символов (англ. UCS, universal character set)  задаёт однозначное соответствие символов кодам — элементам кодового пространства, представляющим неотрицательные целые числа. определен в стандарте ISO/IEC 10646 (включен в стандарт Unicode)
  • 17.
    UCS, продолжение... запись Unicodeсимволов вида: U+0075 пример: u (U+0075 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴜ) + ¨(U+0308 ᴄᴏᴍʙɪɴɪɴɢ ᴅɪᴀᴇʀᴇsɪs) => ü mac: unicode hex input (l&t), option + code windows: alt + “+” + code www.fileformat.info/info/unicode/char/search.htm .../search.htm?q=diacritic&preview=entity
  • 18.
    Кодовое пространство (codespace)в Unicode разбито на 17 плоскостей по 2^16 (65536) code points (кодовых точек) набор всех code points: 0hex to 10FFFFhex Нулевая плоскость называется Basic Multilingual Plane (BMP) в ней расположены символы наиболее употребительных письменностей.  Т.е. это все что в диапазоне 0x0 - 0xFFFF (не все используются, верхняя часть диапазона зарезервирована)
  • 19.
    Unicode transformation format UTF-16BE, UTF-16LE UTF-32BE, UTF-32LE UTF-8, UTF-EBCDIC BE (big-endian) – от старшего к младшему LE (little-endian) – от младшего к старшему если нет BOM (о нем ниже) то стандартом предписывается  BE (тупоконечный)
  • 20.
    BOM byte order mark Важендля UTF-16 и UTF-32. (для определения тупо/остро- конечности) Для UTF-8 обычно не нужео, но есть в стандарте и часто используется в Windows. UTF-16,32 программы по BOM могут понять (если захотят), что в файле utf-8.
  • 21.
    UTF-16 включает в себяUCS-2, как подмножество особенность кодировки, что символы не из 0-й plane  задаются составными кодами 16+16=32 бита или суррогатными парами
  • 22.
    UTF-32 фиксированной ширины,всегда 4 байта, UTF-32/UCS-4 requires four bytes to encode any character.  http://en.wikipedia.org/wiki/UTF-32/UCS-4
  • 23.
    UTF-8 Unix/Web кодировка 2/09/1992 К.Томпсон & Р. Пайк ASCII-совместима, 1–6 байт (4) BOM – не нужен! UTF-EBCDIC – редкая экзотика для мейнфреймов
  • 24.
  • 25.
    Композиция символов – cимволызадающиеся несколькими кодами. Для некоторых символов есть как композитные так и монолитные формы записи Ё (U+0401) и Й (U+0419),  Е +  ̈ (U+0415 U+0308) И +  ̆ (U+0418 U+0306) Character General Category – каждый code point относится к одной из основных категорий. Буква, знак (см диакр. знаки), число(number), пунктуационный знак, символ, разделитель (см. http://www.unicode.org/versions/Unicode6.0.0/ch02.pdf)
  • 26.
    Нормализация – Поскольку однии те же символы можно представить различными кодами, что иногда затрудняет обработку, существуют процессы нормализации, предназначенные для приведения текста к определённому стандартному виду. Case folding – приведение символа или строки к заданному регистру (м. б. 1–3) Collation (UCA) алгоритм сравнения двух строк, с учетом особенностей Unicode
  • 27.
    ICU International Components for Unicode набор C-библиотек для разработки программ с поддержкой Unicode Для Python есть pyICU в Perl5 не используется!
  • 28.
  • 29.
  • 30.
  • 31.
    «Все-таки UTF8 вперле - это немного черная магия» Alex Povolotsky, рассылка Moscow.pm
  • 32.
  • 33.
    презентации tchrist (OSCON 2011) утилитыtchrist http://stackoverflow.com/questions/6162484/ why-does-modern-perl-avoid-utf-8-by- default/6163129#6163129  http://local.joelonsoftware.com/wiki/ Абсолютный_Минимум,_который_Каждый_ Разработчик_Программного_Обеспечения_ Обязательно_Должен_Знать_о_Unicode_и_ Наборах_Символов http://ru.wikipedia.org/wiki/Юникод http://perldoc.perl.org/search.html?q=perluni
  • 34.
  • 35.
    «возможно, я несмог раскрыть всё, что надо знать о кодировках символов и Unicode, но я надеюсь, что если вы не уснули до этого места, вы уже знаете достаточно, чтобы возвратиться к программированию и использовать антибиотики вместо пиявок и кровопусканий»
  • 36.
    как стать экспертомпо работе с кодировками «Encoding is for i/o; in the Perl space, text must be Perl character strings. I repeat: Encoding is for i/o; in the Perl space, text must be Perl character strings. Write that 100 times, display it next to your monitor(s), record it and play it whilst sleeping on your ipod for one week, have it tattooed on your fingers, and in no time you'll be known as the encoding guru in your company» http://sigstp.blogspot.com/