Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Tout ce qu'un dev devrait savoir à propos d'Uni...

Tout ce qu'un dev devrait savoir à propos d'Unicode

UTF-8, charsets, points de code, glyphes, CLDR, etc. Tout le monde connaît quelques mots des vocabulaires Unicode. Cette norme mondiale rassemble presque toutes les langues écrites sur Terre. Je vous propose de plonger dans ce fantastique projet qui organise tout ces éléments linguistiques et culturels importants de notre époque. Voyons comment nous, les développeurs, avons le privilège de jouer avec ces derniers au niveau technique. Comment cela marche-t-il? Comment cela s'applique-t-il aux applications que nous créons? Avez-vous entendu parler de collations ? Translitérations ? Grapheme Clusters ? NFC ? Laissez-vous guider.

Nicolas Grekas

March 31, 2017
Tweet

More Decks by Nicolas Grekas

Other Decks in Technology

Transcript

  1. x0 x1 x2 x3 x4 x5 x6 x7 x8 x9

    xA xB xC xD xE xF 0x NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI 1x DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 2x SP ! " # $ % & ' ( ) * + , - . / 3x 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4x @ A B C D E F G H I J K L M N O 5x P Q R S T U V W X Y Z [ \ ] ^ _ 6x ` a b c d e f g h i j k l m n o 7x p q r s t u v w x y z { | } ~ DEL 8x € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž 9x ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ Ax NBS P ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ Bx ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ Cx À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Dx Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß Ex à á â ã ä å æ ç è é ê ë ì í î ï Fx ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
  2. x0 x1 x2 x3 x4 x5 x6 x7 x8 x9

    xA xB xC xD xE xF 0x NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI 1x DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 2x SP ! " # $ % & ' ( ) * + , - . / 3x 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4x @ A B C D E F G H I J K L M N O 5x P Q R S T U V W X Y Z [ \ ] ^ _ 6x ` a b c d e f g h i j k l m n o 7x p q r s t u v w x y z { | } ~ DEL 8x € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž 9x ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ Ax NBSP ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ Bx ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ Cx À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Dx Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß Ex à á â ã ä å æ ç è é ê ë ì í î ï Fx ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
  3. P U+0050 LATIN CAPITAL LETTER P س U+0633 ARABIC LETTER

    SEEN 和U+548C CJK UNIFIED IDEOGRAPH-548C ☮ U+262E PEACE SYMBOL  A chaque caractère son numéro, un nom et des propriétés (catégorie, script, etc.)
  4.  De point de code à séquence d’octets ◦ UTF-8

    : 1, 2, 3 ou 4 octets ◦ UTF-16 : 2 ou 4 octets ◦ UTF-32 : 4 octets á U+00E1 LATIN SMALL LETTER A WITH ACUTE UTF-16BE 00 E1 UTF-8 C3 A1 あ U+3042 HIRAGANA LETTER A UTF-16BE 30 42 UTF-8 E3 81 82
  5.  Sur-ensemble d’ASCII  Auto-synchronisé  etc. Octet 1 Octet

    2 Octet 3 Octet 4 0xxxxxxx 110xxxxx 10xxxxxx 1110xxxx 10xxxxxx 10xxxxxx 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  6.  Concerne un peu plus de 1000 caractères  Folding

    – comparaison insensible à la casse ◦ Comparer les chaînes en minuscules ◦ Une majuscule, deux minuscules : Σ ⇔ σ/ς ◦ Exception turque : I ⇔ i vs İ ⇔ i et I ⇔ ı ◦ Insensibilité complète : ß ⇔ ss
  7.  NFC D é j à U+0044 U+00E9 U+006A U+00E0

     NFD D e ◌ ́ j a ◌ ̀ U+0044 U+0065 U+0301 U+006A U+0061 U+0300  Opérateur d’égalité ? (=, ≠) 11000011 10101001 01100101 11001100 10000001
  8.  le lituanien place y entre i et k 

    ch en espagnol est traité comme un seul caractère  œ est entre oe et of  en danois, Å est une lettre séparée, classée après Z  en suédois, v et w ne sont que des variations  l'allemand traditionnel considère ä équivalent à ae  cocorico, côté > coté > côte > cote
  9.  NFC D é j à U+0044 U+00E9 U+006A U+00E0

     NFD D e ◌ ́ j a ◌ ̀ U+0044 U+0065 U+0301 U+006A U+0061 U+0300  Quel est le 2e caractère ? le 3e ?
  10.  Majuscules, minuscules, folding  Compositions, ligatures  Comparaison :

    normalisations et collations  Segmentation : caractères, mots, phrases et césures  Locales : conventions culturelles, translittérations  Identifiants et sécurité, confusables  Affichage : direction, largeur
  11.  ICU : Java et C/C++ ◦ Licence X-like, soutenu

    par IBM, implémentation de référence  JavaScript : Unicode (NFC)  Python : chaînes typées (RIP PHP 6)
  12.  iconv_set_encoding('UTF-8') ◦ iconv($in_charset , $out_charset , $str) ◦ iconv_strlen($str)

    ◦ iconv_substr($str, $start, $length) ◦ iconv_strpos($haystack, $needle, $offset = 0) ◦ iconv_strrpos($haystack, $needle)  Manipulation de chaînes UTF-8 : fait ! NFC : Déjà NFD : De◌ ́ja◌ ̀
  13.  mb_internal_encoding('UTF-8') ◦ Équivalents d’iconv ◦ mb_strtolower/upper (), pas de

    folding ◦ mb_stripos(), folding simple  Manipulation de chaînes UTF-8 : fait ! (bis)  Manipulation de la casse : fait ! % folding NFC : Déjà NFD : De◌ ́ja◌ ̀
  14.  Avec le modificateur u : /./u  Donne accès

    aux propriétés Unicode ◦ \x{00E9} ou simplement é ssi source UTF-8 ◦ \p{Greek} ◦ \p{Mn} ◦ \X ⇔ (?>\PM\pM*) pour PCRE < 8.32  Vérifier la validité UTF-8 de $str : preg_match('//u', $str)  Manipulation de chaînes UTF-8 : fait ! (ter)  Manipulation des propriétés Unicode : fait ! NFC : Déjà NFD : De◌ ́ja◌ ̀
  15.  grapheme_extract — Extrait un groupe de graphèmes d'une chaîne

    UTF-8  grapheme_stripos  grapheme_stristr  grapheme_strlen  grapheme_strpos  grapheme_strripos  grapheme_strrpos  grapheme_strstr  grapheme_substr  Manipulation par graphème cluster : fait ! NFC : Déjà NFD : De◌ ́ja◌ ̀
  16.  Normalizer::isNormalized()  Normalizer::normalize()  Normalizer::NFC, ::NFD, ::NFKC, ::NFKC, ::NONE

     Tester l’égalité de chaînes : fait ! NFC : Déjà NFD : De◌ ́ja◌ ̀
  17.  utf8_binary : A != a  utf8_general_ci : œ

    ≠ oe  utf8_unicode_ci : œ = oe  utf8_swedish_ci : z > å > æ = ä > ö = ø  SET NAMES utf8mb4 : Sécurité et emoji
  18.  toLowerCase  toUpperCase  toUpperCaseFirst  toFoldedCase  trim

     trimLeft  trimRight  append  prepend  replace  replaceIgnoreCase  replaceAll  replaceAllIgnoreCase  toBytes  toCodePoints  toGraphemes  __toString  indexOf  indexOfIgnoreCase  lastIndexOf  lastIndexOfIgnoreCase  substringOf  substringOfIgnoreCase  lastSubstringOf  lastSubstringOfIgnoreCase  reverse  length  Width  isEmpty  Explode  substr
  19.  Graphemes::fromString('déjà') ->length() ◦ 4 : "d" . "e\xCC\x81" .

    "j" . "a\xCC\x80"  CodePoints::fromString('déjà') ->length() ◦ 6 : "d" . "e" . "\xCC\x81" . "j" . "a" . "\xCC\x80"  Bytes::fromString('déjà')->length() ◦ 8 : "d" . "e" . "\xCC" . "\x81" . "j" . "a" . "\xCC" . "\x80" NFC : Déjà NFD : De◌ ́ja◌ ̀