Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Php et unicode

8 réponses
Avatar
Eric
Bonjour,
J'essaye de lire et d'écrire avec PHP dnas une base unicode (SQL Server) et
je n'y arrive pas.
J'ai ajouté la dll MbString qui est censée faire les conversions, mais il ne
se passe rien. J'ai toujours ???? ??? à la place de la chaîne de caractères
russe que j'ai saisi dans ma base.

Quelqu'un aurait-il une solution ?

Merci d'avance...

8 réponses

Avatar
loufoque
Eric a dit le 25/10/2005 à 14:54:

J'essaye de lire et d'écrire avec PHP dnas une base unicode (SQL Server) et
je n'y arrive pas.


Ce n'est pas une bonne description du problème.


J'ai ajouté la dll MbString qui est censée faire les conversions


Quel est l'intérêt de faire des conversions ?


, mais il ne
se passe rien.


S'il ne se passe rien, c'est que tu n'as pas mis de code pour qu'il se
passe quelque chose.


J'ai toujours ???? ??? à la place de la chaîne de caractères
russe que j'ai saisi dans ma base.


Tu as indiqué au client utiliser le même charset que celui dans lequel
sont les données ?
Encore faudrait-il que tu sois certain du charset dans lequel sont ces
données, et si tu commences à faire des conversions c'est pas bon du
tout d'autant plus que tu auras forcément des pertes.


Quelqu'un aurait-il une solution ?


Appliquer le bon sens, comme dans la plupart des problèmes triviaux.

Avatar
dmetzler
J'essaye de lire et d'écrire avec PHP dnas une base unicode (SQL Server) et
je n'y arrive pas.


OK, c'est une base unicode, mais quel encodage utilise-tu ?

Ensuite, PHP ne gère pas unicode en natif. Pour convertir ces chaines,
j'utilise la fonction iconv.

Ce qu'il faut savoir aussi, c'est quel encodage tu envoies au
navigateur. Si tu dis au navigateur d'utiliser IS0-8859-1 il
n'affichera pas les caractères UTF-8 par exemple. Pour spécifier
l'encodage d'une page web, il suffit d'ajouter dans l'entête :

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

Ensuite il faut que tu sois sur d'envoyer de l'UTF-8 à ton client.


En gros, si tu a besoin de caractères russe, le mieux est de tout
faire en UTF-8.
Tu rappatrie les données de ta base SQL-Server. Si elles sont dans
autre chose que UTF-8, il faut les convertir avec iconv.

Ensuite quant tu génère ta page HTML, il faut la générer en UTF-8
et placer le petit entête pour dire au navigateur qu'on lui envoit de
l'UTF-8


Petit rappel : http://french.joelonsoftware.com/Articles/Unicode.html
(non je n'ai pas d'action chez lui, mais c'est le premier article qui
m'a vraiment fait comprendre unicode)

Avatar
Patrick Mevzek
Le Thu, 03 Nov 2005 13:09:29 +0000, a écrit
:
n'affichera pas les caractères UTF-8 par exemple. Pour spécifier
l'encodage d'une page web, il suffit d'ajouter dans l'entête :

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />


Non.
Pour spécifier l'encodage des pages Web, on génére le bon entête
Content-Type, et c'est tout.
(oui en mettant dans le meta ca marche ``en gros'', mais cela ne fera que
créer des problèmes, et ce n'est pas la bonne façon de faire)

Ensuite quant tu génère ta page HTML, il faut la générer en UTF-8
et placer le petit entête pour dire au navigateur qu'on lui envoit de
l'UTF-8


Et cet en-tête se situe au niveau HTTP (c'est bien pour cela qu'il
s'appelle en-tête d'ailleurs) et pas au niveau HTML et sa balise META.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
dmetzler
Merci pour cette petite clarification....

Quels peuvent être les problèmes à utiliser la balise meta plutot
qu'un entête HTTP ? Pour ma part j'évite les entêtes HTTP à part
pour le cache.... (je sais pas pourquoi... surement la
fainéantise...). Tu dis que ça marche "en gros", mais moi j'ai jamais
vu où ça marchait pas.... Je suis intéressé pour des cas où ça
marche pas !

En tout cas, pour des pages statiques, on peut pas envoyer de header
comme ça. Donc soit c'est Apache qui se charge d'envoyer le header (et
souvent il se plante), soit on met la balise meta de toute façon.
Avatar
loufoque

Ensuite, PHP ne gère pas unicode en natif. Pour convertir ces chaines,
j'utilise la fonction iconv.


Il n'y a rien à convertir. Les chaînes de PHP peuvent parfaitement
contenir de l'utf-8.
Le seul problème, c'est que les fontions substr(), strpos() etc. ne sont
pas "unicode aware".

A priori Unicode pour Microsoft c'est UCS-2, SQL Server ne devrait pas
être une exception.
Enfin peut-être tout de même utilise-t-il utf-8 pour la transmission des
données.

Avatar
dmetzler
Oui c'est vrai que si t'es en full unicode du début à la fin, ya rien
à convertir. Dans mon cas, ma base est en CP850 et ma sortie en UTF-8
donc il faut que je convertisse ce qui vient de la base.

sinon il parait que la version 6 de php devrait gérer unicode en natif
(il y avait une info là dessus il y a qq temps sur le newsgroup)
Avatar
Patrick Mevzek
Le Fri, 04 Nov 2005 14:30:06 +0000, a écrit
:
Quels peuvent être les problèmes à utiliser la balise meta plutot
qu'un entête HTTP ?


Ce sont les en-têtes qui l'emportent (ils sont prioritaires), et si donc
ce n'est pas la même information de codage dans les deux, on va avoir des
surprises.

Comme un serveur web bien configuré ne doit jamais laisser partir de page
sans codage dans l'entête HTTP, une application doit prendre du temps
pour le remplir plutôt que pour générer un en-tête meta, sinon ca
n'ira pas bien si le choix par défaut du serveur n'est pas celui prévu
par l'application.

fainéantise...). Tu dis que ça marche "en gros", mais moi j'ai jamais
vu où ça marchait pas.... Je suis intéressé pour des cas où ça
marche pas !


Cf plus haut, tiré directement de mon expérience : une vieille version
de SPIP (mais je ne sais pas si c'est corrigé depuis) générait les meta
mais pas l'en-tête HTTP.
Le serveur ajoutait isolatin1 dans l'en-tête (s'il n'y avait pas déjà
quelque chose).
SPIP mettait utf8 dans les meta.

Dommage...

En tout cas, pour des pages statiques, on peut pas envoyer de header
comme ça. Donc soit c'est Apache qui se charge d'envoyer le header (et
souvent il se plante), soit on met la balise meta de toute façon.


Non. On configure Apache pour envoyer le bon en-tête.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
loufoque
a écrit à :

sinon il parait que la version 6 de php devrait gérer unicode en natif
(il y avait une info là dessus il y a qq temps sur le newsgroup)


Effectivement.