Outils pour utilisateurs

Outils du site


jeux_de_caracteres

Définitions

Point de code

Pour un jeu donné, un point de code désigne le code numérique associé à un "caractère". Ainsi, par exemple, le caractère € est codé par 0xA4 (valeur hexadécimale) par le jeu ISO-8859-15 mais 0x80 par le jeu CP1252 (le jeu ANSI de windows).

Jeu de caractères

Un jeu de caractères définit :

  • les "caractères" qu'ils "représentent" ou non. Exemple : € existe dans les jeux ISO-8859-15 ou CP1252 mais pas en ISO-8859-1
  • le point de code associé au "caractère" (cf point précédent)

La plupart des jeux sont finis et limités. Une majorité des jeux, notamment, n'utilisent, donc ne codent leurs points, que sur un seul octet soit au plus 256 caractères possibles.

Unicode est différent, son but étant de tout représenter, il est défini sur un espace très large tel que [0;0x10FFFF], ce qui peut nécessiter jusqu'à 4 octets (en réalité c'est 21 bits arrondis au-dessus).

Encodage

Dans le cas d'Unicode, qui est bien le nom du jeu de caractères, il existe plusieurs manières standard d'écrire un point de code. Il s'agit des formes, ô combien connues, UTF-8, UTF-16, UTF-32. L'information, le point de code, va être écrite différemment (sa représentation en mémoire) mais désigne toujours la même chose.

  • avec de l'UTF-8, une longueur variable d'octets (8 bits), de 1 à 4, va être utilisée pour coder le point
  • avec de l'UTF-16, une longueur variable de seizets (16 bits/2 octets), de 1 à 2, va être utilisée pour coder le point
  • avec de l'UTF-32, ce sera une longueur fixe de 4 octets, puisque c'est le maximum requis pour coder un point

Chaque représentation a ses avantages et inconvénients : l'UTF-8 sollicitera plus le processeur mais la consommation mémoire est normalement (suivant le contenu de la chaîne - européens) bien moindre. À l'inverse, l'UTF-32 ne demandera pas de calculs du processeur pour relire le point de code mais sera bien plus gourmand en mémoire. UTF-16, de manière générale, est un bon compromis entre les deux. Autre avantage en faveur de l'UTF-8, c'est une certaine compatibilité, les points de code communs avec l'ASCII non-étendu sont codés de la même manière.

Créer un slug pour de l'UTF-8

  • PHP (PHP >= 5.4 avec l'extension intl) :
    <?php
    function slugify(/*UTF-8*/$string) {
        return trim(transliterator_create_from_rules("::Latin; ::Lower; ::Latin-ASCII; ([^a-z0-9])+ > \-")->transliterate($string), '-');
    }
  • Python :
    import re
    import unidecode # http://pypi.python.org/pypi/Unidecode/
     
    def slugify(str): # avec type(str) = 'unicode'
        return re.sub(r'\W+', '-', unidecode.unidecode(str).lower()).strip('-')

Tests :

Chaîne de départ Résultat obtenu
キャンパス kyanpasu
Αλφαβητικός Κατάλογος alphabetikos-katalogos
éloïse (NFC comme NFD) eloise
jeux_de_caracteres.txt · Dernière modification: 08/12/2014 16:28 (modification externe)