«Unicode. Ликбез»

Post on 11-Jun-2015

777 views 2 download

description

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

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

«Unicode. Ликбез»

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

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

Часть 1

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

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

найти в слове

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

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

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

need to use a UCA match at level 1»

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

«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 + codewindows: 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

International Components for Unicode

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

Для Python есть pyICU

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

ICU

Часть 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

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

символов и 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/