1

Je sais pas trop où créer ce topic, ca concerne plein de trucs à la fois.

Prennons en C++, quand j'ai char phrase[100]; par exemple. Ca veut dire que le compilo va faire allouer 100 octets. Mais si les caractères ne sont pas encodés en ascii-pur, chaque caractère va prendre plus de place non?

De la même façon, en php/mysql & co, pour une table SQL qui contient un champ textuel, j'aimerais extraire un équivalent ascii de chaque lettre. Donc le nombre correspondant à chaque lettre ne va pas être compris entre 0 et 255, comment récuperer ce nombre en php par exemple? (mais aussi en c++ selon vos réponses à la première question).

Merci d'avance
Tout ce qui passe pas par le port 80, c'est de la triche.

2

Pas sûr que ça réponde à la question, mais au cas où...
Regarde la doc php de utf8_encode (http://www.php.net/manual/fr/function.utf8-encode.php), il y a quelques indications sur la représentation des caractères...
avatar

3

les caractères ascii standards prennent 8 bits

les caractères dont le code UNICODE peut tenir dans 11 bits prennent 2 caractères ASCII (ça inclut la plupart des accents et le grec)

les caractères UNICODE qui ont besoin de 16 bits au plus prennent 3 caractères ASCII (ça inclut la plupart des idéogrammes asiatiques + le coréen et le japonais)

etc... on peut avoir besoin de 6 ASCII au max, pour les unicodes 32 bits, mais en général on y arrive jamais... sauf si tu veux écrire des runes, des idéogrammes rares ou du copte grin

wikipédia précise bien ça : http://fr.wikipedia.org/wiki/UTF-8

4

en tout cas c'est casse kooyes l'utf dans les langages web
avatar
納 豆パワー!
I becamed a natto!!!1!one!

5

6

dans le genre ca fait foirer les JSON. Mais bon, c'est pas ce problème là que je voulais évoquer. Merci wink
Tout ce qui passe pas par le port 80, c'est de la triche.

7

et ça fait foirer le flash
et les bdd

mais bon ya pas le choix.

8

les caractères dont le code UNICODE peut tenir dans 11 bits prennent 2 octets (ça inclut la plupart des accents et le grec)

les caractères UNICODE qui ont besoin de 16 bits au plus prennent 3 octets (ça inclut la plupart des idéogrammes asiatiques + le coréen et le japonais)
Ca risque pas d'être des caractères ASCII, justement ^^

Non, ça marche plutôt bien, par contre il faut bien savoir pour chaque chaîne quel est son encodage actuel, et faire les conversions (ou pas) aux bons endroits.
Par exemple, si tu as une chaîne en ISO-8859-1 et que tu veux écrire une URL destinée à un site en utf-8, tu vas la sortir comme ça : echo urlencode(utf8_encode($chaine)).

Et concernant JSON, pas de souci non plus, là encore c'est une question de bien encoder et décoder aux bons endroits.
Glisser un header('Content-Type: text/html; charset: UTF-8'); dans la réponse aide bien aussi smile Enfin, l'important est de sortir dans l'encodage que tu annonces, quoi.

9

ouais, confusion caractere ascii/octet toussa désolé...

sinon moi j'aime bien l'utf8 parce que ça passe bien dans les chaines en C et c'est basé sur l'unicode standard, donc ça a des chances de passer partout sans s'embêter avec l'endianess

et pencil pour faire marcher l'utf8 avec PHP le header() arrange énormément de choses pour les navigateurs qui détectent mal l'encodage.

10

Les navigateurs ne sont pas censés devoir detecter le charset du tout, la déclaration du charset est obligatoire! Ce n'est que pour les sites web foireux qui ne le font pas que les navigateurs essaient de deviner (mais devinent souvent mal, donc merci de toujours déclarer le charset!).

Sinon, ce sont les charsets obsolètes non-Unicode qui sont les charsets casse-c***lles, ils sont tous incompatibles. L'UTF-8, lui, permet de tout représenter.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

11

lol smile

mais tellement vrai pour la 2e partie grin

12

Va donc faire un tour sur http://openweb.eu.org/ et aussi la page consacrée aux encodages de caractères http://openweb.eu.org/articles/jeux_caracteres/

Je suis d'accord avec le point de KK et perso je suis le principe de nombreux formats libres qui utilisent en interne et encodent tous caractères saisis par l'utilisateur en utf8.

13

Il suffit qu'un maillon de la chaîne de traitement n'utilise pas UTF-8 par défaut pour que tout pête. Les problèmes d'encodage ont de beaux jours devant eux, y'aura toujours un garnement dans la chaîne.
D'autant plus que les tests d'encodage sont rarement les premiers auxquels en pense, encore moins quand les caractères de sa langue (et donc de ses tests) tiennent sur de l'ASCII.
Faudra que je parle à Amazon des factures qu'il m'envoie un jour.

14

Il suffit qu'un maillon de la chaîne de traitement n'utilise pas UTF-8 par défaut pour que tout pête
Ah là non justement, l'intérêt c'est qu'il est capable de traverser de manière transparente même les chaines ASCII.
En général les soucis d'encodage sur les pages web viennent d'un mauvais marquage (typiquement, il manque la spécification d'encodage dans les en-têtes de la page).

15

Je parlais dans le cas général, ce n'est pas un problème spécifique au Web. Le problème d'Amazon fait intervenir bien d'autres choses que du Web. Je travaille sur des projets d'EAI, quand j'entends mes collègues ou des clients parler de caractères bizarres je rigole doucement.
Dès qu'il y a une chaîne des producteurs et consommateurs de flux de caractères (quels qu'il soit), si un maillon consommateur présuppose un encodage ou si un producteur oublie de le spécifier, c'est perdu. Sachant que les "flux" aujourd'hui sont sous bien des formes, et que plus ça va plus on empile des couches, il y aura toujours plus de risques qu'il y ait un maillon faible.

16

Effectivement. La seule solution serait que tout le monde utilise l'UTF-8! Mais il y a toujours des réticents qui veulent garder leurs charsets obsolètes.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17

Même si tout le monde passait en UTF-8, ça n'empêcherait pas que certains "systèmes" (quelle que soit leur taille) oublient la notion de charset et travaillent directement en ASCII. Il faut surtout que tout le monde soit conscient du risque dès qu'on parle de caractères.

18

Justement, la plupart des outils *nix n'ont eu besoin d'aucune adaptation pour gérer l'UTF-8, par exemple cat peut continuer à bêtement régurgiter tout ce qu'on lui rentre, ça n'endommage pas du tout le texte UTF-8. Et comme un \n est toujours un \n, les logiciels qui travaillent sur les lignes n'ont pas eu de problèmes non plus.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

19

Kevin Kofler (./16) :
Effectivement. La seule solution serait que tout le monde utilise l'UTF-8! Mais il y a toujours des réticents qui veulent garder leurs charsets obsolètes.

La solution la plus sûre serait plutôt d'utiliser l'UTF-16, au moins on voit du premier coup si un maillon fait n'importe quoi, plutôt que de le découvrir 3 ans après...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

20

21

Pollux> Mais ce n'est pas compatible ASCII, du coup bonne chance pour utiliser ça dans certains contextes (IRC par exemple), alors que l'UTF-8 est universel.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

22

Je crois que c'est ce qu'il voulait dire : de cette façon ça foire de manière évidente et immédiate, ce qui facilite la localisation du problème.

23

J'ai bien compris, mais ça veut aussi dire que ça empêche l'utilisation sous certains contextes!
* Partout où l'ASCII doit être inchangé car utilisé pour des commandes réservées, mais les caractères avec le bit du poids fort à 1 sont passés intouchés (par exemple IRC, les shells *nix etc.), l'UTF-8 peut être utilisé, l'UTF-16 non.
* Partout où les caractères nuls (\0) posent problème (donc pour pratiquement tout ce qui est stocké dans une chaîne C! Ça concerne beaucoup de logiciels en C ou C++), l'UTF-8 peut être utilisé, l'UTF-16 non.
etc.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

24

Oui, c'était l'objectif ^^
L'optique est plus une chaine de traitement entièrement sous contrôle d'un protagoniste qui cherche à réaliser une transition de la totalité de la chaîne sans oublier des morceaux (et mine de rien c'est pas évident).
En mettant un format qui pete tout, y'a juste à localiser dans le flux de données l'endroit où ça merde pour savoir ce qu'on a oublié smile

25

Le fait que les caractères en UTF-8 puissent prendre un nombre élévé de char est justement la raison pour laquelle Windows ne gère pas de "locale" en UTF-8 (Les fonctions Win32 peuvent seulement convertir) : Trop de fonctions char de Windows reposent sur le fait qu'un caractère ne fasse jamais plus de deux char.
Ce problème est ne se présente pas avec l'UTF-16 (si l'on exclut les histoires d'accents) mais comme l'a dit Kevin, on n'utilise pas l'UTF-16 aussi facilement...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

26

Hmmm en UTF-16 tu as exactement le même problème de ne pas avoir d'équivalence entre nombre d'octets et nombre de caractères, vu qu'un caractère peut prendre 1 ou 2 mots de 16 bits.

27

Mais leur système foireux ne gère pas vraiment l'UTF-16, seulement le vieux UCS-2 qui ne peut représenter que les caractères du BMP. Seulement très peu d'applications sur leur système gèrent les surrogate pairs (par exemple celles basées sur Qt 4 smile).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

28

Et en php, il y a un équivalent de asc et chr pour les lettres utf8? genre si c'est codé sur un octet, ca renvoi un truc entre 0 et 127 (codé sur 7 bits quoi), si c'est sur deux octets, un entier plus grand qui se code sur 10bits, etc.. surtout un équivalent de asc.

Il faut le faire à la main?
Tout ce qui passe pas par le port 80, c'est de la triche.

29

Tout ce qui passe pas par le port 80, c'est de la triche.

30

Kevin Kofler (./27) :
Mais leur système foireux ne gère pas vraiment l'UTF-16, seulement le vieux UCS-2 qui ne peut représenter que les caractères du BMP. Seulement très peu d'applications sur leur système gèrent les surrogate pairs.

C'est pas ce qui est dit ici:
http://en.wikipedia.org/wiki/UTF-16/UCS-2#Use_in_major_operating_systems_and_environments


...Enfin disons, le système le supporte et en supporte forcément l'affichage.
Mais Windows ne met pas encore à disposition des fonctions permettant de tronquer une chaîne sans casser les surrogate pairs et/ou les accents, je le reconnais. Les autres systèmes proposent-ils ce genre de services ?
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.