Partage
  • Partager sur Facebook
  • Partager sur Twitter

Unicode : utf-8, utf-16 et utf-32

    14 octobre 2012 à 11:15:17

    Bonjour à tous et à toutes.

    Je viens chercher quelques avis sur quel type d'unicode utiliser, dans quels contextes, et pourquoi est-ce mieux/moins bien.

    En fait, je cherche à pouvoir convertir tous types de caractères en majuscule/minuscule. Pour ça, j'utilise la fonction php mb_strtolower/upper, seulement ça ne convertit pas tout (par exemple les chiffres romains), et php est relativement limité en ce qui concerne l'unicode (de ce que j'ai pu lire).
    J'ai regardé la doc plus en détail, d'autres sites, etc. mais je n'ai trouvé aucune fonction étendant mb_strtolower/upper (ou str_convert_case). Du coup je dois la créer (comment faire ça proprement, je sais pas trop encore, mais ça viendra).
    Du coup, j'me suis posé la question de l'unicode. Lequel choisir ? J'ai lu plusieurs avis différents sur des sites, UTF-32 a l'avantage d'être sur 32 bits, ce qui rend possible toutes les combinaisons en un seul block mais il est lourd côté mémoire (même si je pense pas que ce soit un réel problème maintenant) et on retrouve énormément d'octets nuls (c'est du gâchis).
    Du coup pourquoi pas l'utf-16 qui semble être un bon compromis et qui garde la compatibilité (si je me trompe pas) avec utf-8. Il a aussi des octets nuls, mais en moins grande quantité que utf-32.
    Enfin l'utf-8 qui est couramment utilisé, qui est pas très gourmand en mémoire mais qui demande plus mal de traitement.

    Bref, qu'en pensez-vous ? Lequel choisir sachant qu'on pourra retrouver n'importe quel type de caractères (chinois, japonais, français, anglais, allemand, grec, etc.)
    De même, si vous connaissez une fonction plus performante que celles de php par défaut, n'hésitez pas à me le dire, ça m'arrangerait ^^.

    Merci beaucoup, bonne journée.

    PS : j'espère pas avoir raconté trop de conneries, l'unicode n'est pas mon fort..
    • Partager sur Facebook
    • Partager sur Twitter
      14 octobre 2012 à 11:30:05

      Salut !

      Je crois que l'UTF-8 contient déjà une bonne partie des caractères que tu cites. Une chose est sûre, tout le jeu latin y est (avec les accentuations et les trucs étranges des langues slaves). On y trouve le grec aussi (je soupçonne que ce soit dû aux mathématiques). Peut-être le cyrillique et un peu de caractères asiatiques, mais là, ce n'est plus certain.

      Je ne me rappelle plus quel est l'encodage, mais il me semble bien que c'est UTF-8, justement, qui prends un nombre variable de bytes selon le caractère encodé (d'où la possibilité de choisir avec ou sans BOM, si je ne m'abuse), permettant de s'adapter à finalement pas mal de choses. UTF-16 est venu pour éviter ce problème de BOM et de caractères extensibles, UTF-32 parce qu'il fallait une norme qui puisse inclure plus de caractères, et je crois avoir enregistré une fois que l'ONU penche sur l'UTF-64 (!) depuis quelques années, parce que UTF-32 ne permets pas encore tout (re-!).

      Par contre, pour ce qui est des fonctions de conversion de casse, je n'en ai pas la moindre idée, je n'ai jamais eu autant de choses à faire sur des chaînes avec des dialectes de tous azimuts
      • Partager sur Facebook
      • Partager sur Twitter
      OC à changerFAQ PHP • Et avant celaTutoriel WAMP • Code illisible ? Un p'tit 👍 ici@Zeste de Savoir
        14 octobre 2012 à 11:32:22

        T'as un exemple ?

        De toute façon, concernant mbstring et la casse :
        * pour un jeu Unicode, tout est d'abord reconverti en UTF-32 (table commune basée sur les points de code) => aucune importance que ce soit de l'UTF-8/16/32 au départ même si UTF-8 est plus "naturel" (obligatoire ou presque) pour PHP. Une fois la transformation de casse effectuée, c'est reconverti dans le jeu d'origine.
        * c'est du simple case mapping (1 point <=> 1 point) pas du full (les i des langues turques ne sont pas gérés non plus pour Unicode)

        Pour au-dessus : la forme, UTF-8/16/32, ne définit que la manière de "sérialiser" un point code Unicode. Au final, l'information est toujours la même (le point de code), ce qui change ce n'est que la manière de le représenter (UTF-8 = sur 1 octet - longueur variable de 1 à 4 unités, 16 sur 2 - longueur variable de 1 à 2 unités, 32 sur 4 - longueur fixe de fait). Aussi, sachant que la valeur maximale d'un point est 0x10FFFF (avec encore environ 850 000 points libres), fait que tout point de code ne nécessite théoriquement qu'au plus 21 bits donc UTF-64 ...

        Quant au BOM, en UTF-8, il ne sert qu'à indiquer le jeu éventuellement. Étant donné que les points sont codés sur 1 octet, le problème de boutisme ne se pose pas. Au contraire des formes UTF-16 et 32, où le BOM, en plus de potentiellement permettre de détecter le jeu, sert surtout à indiquer comment lire le fichier (ordre des octets, endianness - LE/BE).
        • Partager sur Facebook
        • Partager sur Twitter

        julp.fr ~ Les règles sur OC ~ je ne fais pas d'effort pour ceux qui n'en font pas

          14 octobre 2012 à 11:46:43

          Salut et merci pour ta réponse.

          Oui, UTF-8 code sur 1 à 4 bytes, tandis que utf-16 va de 2 à 4 bytes et utf-32 code tout sur 4 bytes. Mais il me semble que l'utf-8 code tous les caractères aussi (mais le traitement est beaucoup plus lourd que du utf-32 par exemple).
          De l'utf-64 ? Ca prendrait en compte quoi comme caractères :o ?

          En fait, ce que je cherche à faire est une classe String, similaire à ce qu'on peut trouver sur Python. Mon but est de pouvoir manipuler facilement les chaines de caractères (par exemple, pour accéder au i-ième caractère de la chaine, supprimer un ou plusieurs éléments, etc. le tout à l'aide d'un objet). Je compte ensuite étendre ça aux entiers, etc. et reproduire les dico, etc. que l'on retrouve en Python (si ça n'existe pas déjà en php). Mais malheureusement, je ne peux pas savoir à l'avance quels caractères je vais avoir. Et pour effectuer une conversion de casse (par exemple), il faut que tous les caractères y passent.
          Du coup je me posais la question de l'unicode pour la plus ou moins grande "facilité" de traitement des caractères. Viendra ensuite la mise en place.

          Bye :)
          • Partager sur Facebook
          • Partager sur Twitter

          Unicode : utf-8, utf-16 et utf-32

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown