«Unicode. Ликбез»

36
«Unicode. Ликбез»

description

- что каждый разработчик должен знать о Unicode- базовые понятия- «как начать использовать антибиотики вместо пиявок и кровопусканий» ©Joel

Transcript of «Unicode. Ликбез»

Page 1: «Unicode. Ликбез»

«Unicode. Ликбез»

Page 2: «Unicode. Ликбез»

Ликбе́з (ликвида́ция безгра́мотности)В переносном смысле — обучение неподготовленной аудитории базовым понятиям какой-либо науки, процесса или явления.

Page 3: «Unicode. Ликбез»

Упрощенец – тот, кто поверхностно, не вникая в суть, подходит к решению сложных задач, вопросов.

Page 4: «Unicode. Ликбез»

Часть 1

Задачка, в процессе решения которой, автор пришел к

пониманию своего невежества

Page 5: «Unicode. Ликбез»

найти в слове

Îñţérñåţîöñåļîžåţîöñ подстроку Nation

Page 7: «Unicode. Ликбез»

Решение №1use 5.014;use utf8;use Unicode::Normalize;binmode STDOUT, ':encoding(UTF-8)';my $str = "Îñţérñåţîöñåļîžåţîöñ";my $look = "Nation";say "before: $str\n";$str = NFD($str);$str =~ s/\pM//og; # remove "marks"say "after: $str";say "is_match: ", $str =~ /$look/i || 0;

Page 8: «Unicode. Ликбез»

tchrist: «This is the wrong way to do it. You

need to use a UCA match at level 1»

Page 9: «Unicode. Ликбез»

Решение №2use 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);

Page 10: «Unicode. Ликбез»

«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»

Page 11: «Unicode. Ликбез»

?

Page 12: «Unicode. Ликбез»

Часть 2

Ликбез

Page 13: «Unicode. Ликбез»

 Unicode – это не кодировка или таблица символов.

Это стандарт! В который входит, кроме таблиц символов и правил их кодирования, еще много-много всего

Page 14: «Unicode. Ликбез»

Стандарт Unicodeтаблицы символов, несколько механизмов кодирования

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

правила casemapping, casefolding

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

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

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

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

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

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

.... много всего другого ....

Page 15: «Unicode. Ликбез»

TLA (ТБС)UCS

UTF

BMP

BOM

UCA

NFC, NFD

ICU

Page 16: «Unicode. Ликбез»

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

Page 17: «Unicode. Ликбез»

UCS, продолжение...

запись Unicode символов вида: U+0075

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

www.fileformat.info/info/unicode/char/search.htm .../search.htm?q=diacritic&preview=entity

Page 18: «Unicode. Ликбез»

Кодовое пространство (codespace) в Unicode разбито на 17 плоскостей по 2^16 (65536) code points (кодовых точек)набор всех code points: 0hex to 10FFFFhex

Нулевая плоскость называется

Basic Multilingual Plane (BMP)в ней расположены символы наиболее употребительных письменностей. Т.е. это все что в диапазоне 0x0 - 0xFFFF (не все используются, верхняя часть диапазона зарезервирована)

Page 19: «Unicode. Ликбез»

Unicode transformation format

UTF-16BE, UTF-16LE

UTF-32BE, UTF-32LE

UTF-8, UTF-EBCDIC

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

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

Page 20: «Unicode. Ликбез»

BOM

byte order mark

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

Page 21: «Unicode. Ликбез»

UTF-16

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

Page 22: «Unicode. Ликбез»

UTF-32

фиксированной ширины, всегда 4 байта,UTF-32/UCS-4 requires four bytes to encode any character. http://en.wikipedia.org/wiki/UTF-32/UCS-4

Page 23: «Unicode. Ликбез»

UTF-8

Unix/Web кодировка

2/09/1992 К. Томпсон & Р. Пайк

ASCII-совместима, 1–6 байт (4)

BOM – не нужен!

UTF-EBCDIC – редкая экзотика для мейнфреймов

Page 24: «Unicode. Ликбез»

character

symbol

grapheme

glypth

letter

diacritical mark

ideogram

Page 25: «Unicode. Ликбез»

Композиция символов – 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)

Page 26: «Unicode. Ликбез»

Нормализация – Поскольку одни и те же символы можно представить различными кодами, что иногда затрудняет обработку, существуют процессы нормализации, предназначенные для приведения текста к определённому стандартному виду.

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

Collation (UCA) алгоритм сравнения двух строк, с учетом особенностей Unicode

Page 27: «Unicode. Ликбез»

International Components for Unicode

набор C-библиотек для разработки программ с поддержкой Unicode

Для Python есть pyICU

в Perl5 не используется!

ICU

Page 28: «Unicode. Ликбез»

Page 29: «Unicode. Ликбез»

Часть 3

Домашняя работа

Page 30: «Unicode. Ликбез»

Зачем учить?

Page 31: «Unicode. Ликбез»

«Все-таки UTF8 в перле - это

немного черная магия»

Alex Povolotsky, рассылка Moscow.pm

Page 32: «Unicode. Ликбез»

Как учить?

Page 33: «Unicode. Ликбез»

презентации 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

Page 35: «Unicode. Ликбез»

«возможно, я не смог раскрыть всё, что надо знать о кодировках

символов и Unicode, но я надеюсь, что если вы не уснули до этого места, вы уже знаете

достаточно, чтобы возвратиться к программированию и

использовать антибиотики вместо пиявок и кровопусканий»

Page 36: «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/