Unicode : bases et concepts
Unicode : état de lřart
PatchworkUtf8
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
Peace
和平 ☮
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
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.)
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
á U+00E1
De point de code UTF-16BE
LATIN SMALL LETTER A WITH ACUTE
00 E1
à séquence dřoctets UTF-8 C3 A1
◦ UTF-8 : 1, 2, 3 ou 4 octets
◦ UTF-16 : 2 ou 4 octets あ U+3042
HIRAGANA LETTER A
◦ UTF-32 : 4 octets UTF-16BE 30 42
UTF-8 E3 81 82
BOM U+FEFF
UTF-32BE 00 00 FE FF
UTF-32LE FF FE 00 00
Byte Order Mark UTF-16BE
UTF-16LE
FE FF
FF FE
UTF-8 EF BB BF ()
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
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 ⇔ ı
◦ Full folding : ß ⇔ ss
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
Å
Å
U+00C5
LATIN CAPITAL LETTER A WITH RING ABOVE
A+◌̊ 0041, 030A
LATIN CAPITAL LETTER A, COMBINING RING ABOVE
f+i
fi
U+0066, U+0069
LATIN SMALL LETTER F, LATIN SMALL LETTER I
fi FB01
LATIN SMALL LIGATURE FI
U+1103, U+116E, U+11A8
ᄃ+ᅮ+ᆨ
둑
HANGUL CHOSEONG TIKEUT, HANGUL JUNGSEONG U,
HANGUL JONGSEONG KIYEOK
둑 U+B451
HANGUL SYLLABE DUG
Comment tester lřégalité ? (=, ≠)
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
Forme Composée, Décomposée, de Kompatiblité
U+1E0B, U+0323
ḋ+◌ LATIN SMALL LETTER D WITH DOT ABOVE,
COMBINING DOT BELOW
U+0064, U+0323, U+0307
d+◌+◌̇ LATIN SMALL LETTER D,
COMBINING DOT BELOW, COMBINING DOT ABOVE
NFD
U+1E0D, U+0307
ḍ+◌̇ LATIN SMALL LETTER D WITH DOT BELOW,
COMBINING DOT ABOVE
NFC
f+i
fi
U+0066, U+0069
LATIN SMALL LETTER F, LATIN SMALL LETTER I NFKD, NFKC
fi U+FB01
LATIN SMALL LIGATURE FI NFD, NFC
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
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 ?
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
ICU : Java et C/C++
◦ Licence X-like, soutenu par IBM, utilisé comme
implémentation de référence pour Unicode et +
Perl 6 Parrot : NFG
◦ NFC + Graphèmes Clusters
JavaScript : Unicode (NFC)
Python : chaînes typées
PHP : iconv, mbstring, pcre, intl
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
NFC : Déjà
NFD : De◌ ja◌
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
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
NFC : Déjà
NFD : De◌ ◌
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 ⇔ (?>PMpM*) 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 !
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
NFC : Déjà
NFD : De◌ ◌
use Normalizer as n;
n::isNormalized($str, $form = n::NFC)
n::normalize($str, $form = n::NFC)
n::NFC, n::NFD, n::NFKC, n::NFKC, n::NONE
Tester lřégalité de chaînes : fait !
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
NFC : Déjà
NFD : De◌ ◌
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 !
◦ Encore un peu jeune, attention aux bugs
◦ https://bugs.php.net/55562, 61860 et 62759
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
PatchworkUtf8
grapheme_*
Normalizer
mbstring
xml
iconv
pcre
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
Les fonctions PHP, version UTF-8
◦ Limité au sous-ensemble qui le nécessite
◦ Préfixe u:: pour déclarer lřintention dans le code
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
Quelques extras, workarounds et
bootstrapping
Couvert par de nombreux tests unitaires
Licences Apache-2.0 et GPL-2.0
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
https://github.com/FSX/php-utf8
Mediawiki, PhpBB, Drupal, etc.
Différences majeures
◦ Gestion des graphème clusters
◦ API déjà documentée : cf. documentation PHP
◦ Bootstrapping via autoload possible
◦ Testable et comparable en même temps
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
Editeur de code en mode UTF-8 sans BOM
Vérifiez la validité UTF-8 de vos entrées
Mais ne supprimez pas les caractères erronés
◦ javaxFFscript:alert("XSS")
◦ preg_match('//u', $v) or $v = u::utf8_encode($v);
Normalisez vos entrées UTF-8 : NFC on demand
require 'bootup.utf8.php';
use PatchworkUtf8 as u;
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8
NFC repousse les graphèmes clusters
Pour manipuler des données (cf. MySQL),
pas les identifiants.
A utiliser avec discernement
PHP Tour Ŕ Nantes 2012
https://github.com/nicolas-grekas/Patchwork-UTF8