Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

Nicolas Grekas

March 31, 2017
Tweet

More Decks by Nicolas Grekas

Other Decks in Technology

Transcript

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

    View Slide

  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 ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

    View Slide

  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 ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

    View Slide

  4. View Slide

  5. Peace مالس
    和平 ☮

    View Slide

  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.)

    View Slide

  7. View Slide

  8. http://reedbeta.com/blog/programmers-intro-to-unicode/

    View Slide

  9. View Slide

  10. View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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 ?

    View Slide

  17. View Slide

  18. View Slide

  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

    View Slide

  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)

    View Slide

  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◌ ̀

    View Slide

  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◌ ̀

    View Slide

  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◌ ̀

    View Slide

  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◌ ̀

    View Slide

  25.  Normalizer::isNormalized()
     Normalizer::normalize()
     Normalizer::NFC, ::NFD, ::NFKC, ::NFKC, ::NONE
     Tester l’égalité de chaînes : fait !
    NFC : Déjà
    NFD : De◌ ́ja◌ ̀

    View Slide

  26.  Collator, NumberFormatter, Locale,
    MessageFormatter, IntlDateFormatter,
    Spoofchecker, Transliterator, Fonctions IDN

    View Slide

  27.  utf8_binary : A != a
     utf8_general_ci : œ ≠ oe
     utf8_unicode_ci : œ = oe
     utf8_swedish_ci : z > å > æ = ä > ö = ø
     SET NAMES utf8mb4 : Sécurité et emoji

    View Slide

  28. View Slide

  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

    View Slide

  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◌ ̀

    View Slide

  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

    View Slide

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

    View Slide