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

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.

6baa34bc1e5c347b1003f6abe8691de1?s=128

Nicolas Grekas

March 31, 2017
Tweet

Transcript

  1. https://joind.in/20621 @nicolasgrekas #Symfony_Live

  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 NBS P ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ Bx ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ Cx À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Dx Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß Ex à á â ã ä å æ ç è é ê ë ì í î ï Fx ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
  3. 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 ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
  4. None
  5. Peace مالس 和平 ☮

  6. 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.)
  7. None
  8. http://reedbeta.com/blog/programmers-intro-to-unicode/

  9. None
  10. None
  11.  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
  12.  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
  13.  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
  14.  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
  15.  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
  16.  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 ?
  17. None
  18. None
  19.  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
  20.  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)
  21.  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◌ ̀
  22.  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◌ ̀
  23.  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◌ ̀
  24.  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◌ ̀
  25.  Normalizer::isNormalized()  Normalizer::normalize()  Normalizer::NFC, ::NFD, ::NFKC, ::NFKC, ::NONE

     Tester l’égalité de chaînes : fait ! NFC : Déjà NFD : De◌ ́ja◌ ̀
  26.  Collator, NumberFormatter, Locale, MessageFormatter, IntlDateFormatter, Spoofchecker, Transliterator, Fonctions IDN

  27.  utf8_binary : A != a  utf8_general_ci : œ

    ≠ oe  utf8_unicode_ci : œ = oe  utf8_swedish_ci : z > å > æ = ä > ö = ø  SET NAMES utf8mb4 : Sécurité et emoji
  28. None
  29.  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
  30.  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◌ ̀
  31.  Julp https://www.julp.fr/articles/3-php-et-utf-8.html  Damien Alexandre https://jolicode.com/blog/l-histoire-d-unicode-et-son- adoption-sur-le-web

  32.  https://joind.in/20621  @nicolasgrekas  #Symfony_Live