OVH Cloud OVH Cloud

probleme mssql

8 réponses
Avatar
CrazyCat
Bonjour ici,

je suis en train de migrer un intranet qui était à l'origine en ASP sous
PHP, mais en gardant le serveur sql (sqlserver sur Win2000 server).

Tout fonctionne presque bien:
Il semblerait que les champs textes des bases soit encodés en
windows-1252 (CP1252) alors que je fonctionne (sur mon serveur web) en
ISO-8859-1.
Lorsque j'utilise mb_detect_encoding sur une string venant de la base,
php m'annonce que c'est du ASCII et me remplace tous les caractères
accentués par des "?".
Bien entendu, mb_convert_encoding() ne me permet pas de récupérer mes
accents (ni les lettres qui vont avec).

Existe t'il un moyen de me sauver (sans modifier la base car elle est
encore utilisée en partie avec de l'asp)?

Merci d'avance.
--
Tchattez en liberté: http://www.c-p-f.net
Tout sur les eggdrops: http://www.c-p-f.org
ML @ eggdrop_fr@yahoogroupes.fr

8 réponses

Avatar
Paul Delannoy
CrazyCat a écrit:
Bonjour ici,

je suis en train de migrer un intranet qui était à l'origine en ASP sous
PHP, mais en gardant le serveur sql (sqlserver sur Win2000 server).

Tout fonctionne presque bien:
Il semblerait que les champs textes des bases soit encodés en
windows-1252 (CP1252) alors que je fonctionne (sur mon serveur web) en
ISO-8859-1.
Lorsque j'utilise mb_detect_encoding sur une string venant de la base,
php m'annonce que c'est du ASCII et me remplace tous les caractères
accentués par des "?".
Bien entendu, mb_convert_encoding() ne me permet pas de récupérer mes
accents (ni les lettres qui vont avec).


Comment ça 'bien entendu' : si les octets existent, il y moyen de les
transformer. Lis un peu de doc par ex à
http://fr2.php.net/manual/fr/function.mb-detect-order.php
et tu devrais trouver. Et même au pire rentre la table CP1252 et la
table ISO et fait la conversion en direct...

Avatar
lowlevel
bonjour,
et si tu exporte ta base au format texte, ça ne marche pas?

"CrazyCat" a écrit dans le message de news:
ckm6b7$5rm$
Bonjour ici,

je suis en train de migrer un intranet qui était à l'origine en ASP sous
PHP, mais en gardant le serveur sql (sqlserver sur Win2000 server).

Tout fonctionne presque bien:
Il semblerait que les champs textes des bases soit encodés en windows-1252
(CP1252) alors que je fonctionne (sur mon serveur web) en ISO-8859-1.
Lorsque j'utilise mb_detect_encoding sur une string venant de la base, php
m'annonce que c'est du ASCII et me remplace tous les caractères accentués
par des "?".
Bien entendu, mb_convert_encoding() ne me permet pas de récupérer mes
accents (ni les lettres qui vont avec).

Existe t'il un moyen de me sauver (sans modifier la base car elle est
encore utilisée en partie avec de l'asp)?

Merci d'avance.
--
Tchattez en liberté: http://www.c-p-f.net
Tout sur les eggdrops: http://www.c-p-f.org
ML @


Avatar
CrazyCat
Paul Delannoy wrote:
Comment ça 'bien entendu' : si les octets existent, il y moyen de les
transformer. Lis un peu de doc par ex à
http://fr2.php.net/manual/fr/function.mb-detect-order.php
et tu devrais trouver. Et même au pire rentre la table CP1252 et la
table ISO et fait la conversion en direct...


"Bien entendu" dans le sens "il ne fallait pas s'attendre à être aidé".
J'ai bien lu et bien essayé tout ce qui concerne mb_detect_order et mb_*
mais ça ne m'aide pas.

J'ai même essayé de mettre dans ma requète SQL des "CONVERT USING..."
mais rien n'y fait (sqlserver n'apprécie pas du tout).
En clair, après beaucoup de tests au niveau php, je suis persuadé que je
dois jouer sur la requète, mais trouver les bonnes options et syntaxes
n'est pas aisé lorsqu'il s'agit d'un produit crimo...

--
Tchattez en liberté: http://www.c-p-f.net
Tout sur les eggdrops: http://www.c-p-f.org
ML @

Avatar
Olivier Miakinen

je suis en train de migrer un intranet qui était à l'origine en ASP sous
PHP, mais en gardant le serveur sql (sqlserver sur Win2000 server).


<aparté>
J'ai eu l'impression que tu en discutais hier au Tilsitt, mais je n'ai
pas bien écouté de quoi il s'agissait.
</aparté>

Tout fonctionne presque bien:
Il semblerait que les champs textes des bases soit encodés en
windows-1252 (CP1252) alors que je fonctionne (sur mon serveur web) en
ISO-8859-1.


Il semblerait ? Tu veux dire que tu n'es pas sûr que ce soit du cp1252,
ou bien que certaines chaînes sont en cp1252, mais que d'autres peuvent
être encodées différemment ?

Lorsque j'utilise mb_detect_encoding sur une string venant de la base,
php m'annonce que c'est du ASCII et me remplace tous les caractères
accentués par des "?".


Je ne connaissais pas cette fonction, et je suis allé voir :
http://fr.php.net/manual/en/function.mb-detect-encoding.php

D'après la doc, j'ai l'impression qu'il te retourne le nom de l'encodage
qui est vraisemblablement utilisé (ex.: "JIS" ou "UTF-8") mais qu'il ne
remplace aucun caractère de la chaîne testée.

Par ailleurs,
- si tu veux qu'il détecte "CP1252", il faut lui avoir demandé de tester
cet encodage (encoding_list ou detect_order) ;
- si tu es sûr que c'est du cp1252, il est inutile de le faire tester
par cette fonction ;
- d'après la doc de mb_detect_order, j'ai l'impression que tu ne pourras
pas distinguer ISO-8859-1 de CP1252 car ISO-8859-1 est toujours détecté
positif.

Bien entendu, mb_convert_encoding() ne me permet pas de récupérer mes
accents (ni les lettres qui vont avec).


Tu veux convertir de CP1252 en ISO-8859-1, ou de « ce qui sera détecté,
quel qu'il soit » en ISO-8859-1 ?

Existe t'il un moyen de me sauver (sans modifier la base car elle est
encore utilisée en partie avec de l'asp)?


Je fais la supposition pour te répondre que tu es sûr que tu as du
CP1252, et que tu veux le convertir en ISO-8859-1.

Deux possibilités :

1) La solution du pauvre consiste à supprimer tous les caractères qui
ne sont pas en ISO-8859-1, ou mieux à les remplacer par des points
d'interrogation.
"Un œuf : 1 000 €" -> "Un ?uf : 1 000 ?"

2) La solution riche consiste à les remplacer par des entités HTML.
"Un œuf : 1 000 €" -> "Un &oelig;uf : 1 000 &euro;"
ou -> "Un &#339;uf : 1 000 &#8364;"

Dans le premier cas, il te suffit de remplacer chaque caractère $c tel
que ord($c) est compris entre 128 et 159 inclus.

Pour le second cas, il te faut une table de traduction. Tu trouveras les
codes de CP1252 ici, par exemple :
http://www.miakinen.net/vrac/codeset?set=cp1252
mais il y a sûrement mieux car je ne donne pas le numéro décimal des
valeurs Unicode, or les navigateurs comprennent plus facilement &#8364;
que &#x20AC;.

--
Olivier Miakinen
Est-ce que cette signature ne vous fait pas penser à Bruxelles ?

--

Avatar
CrazyCat
Olivier Miakinen wrote:
Tout fonctionne presque bien:
Il semblerait que les champs textes des bases soit encodés en
windows-1252 (CP1252) alors que je fonctionne (sur mon serveur web) en
ISO-8859-1.
Il semblerait ? Tu veux dire que tu n'es pas sûr que ce soit du cp1252,

ou bien que certaines chaînes sont en cp1252, mais que d'autres peuvent
être encodées différemment ?


mb_detect_encoding me ressort ASCII même si je lui indique de chercher
les autres encodages avant... et j'en ai testé un maximum

Pour le second cas, il te faut une table de traduction. Tu trouveras les
codes de CP1252 ici, par exemple :
http://www.miakinen.net/vrac/codeset?set=cp1252
mais il y a sûrement mieux car je ne donne pas le numéro décimal des
valeurs Unicode, or les navigateurs comprennent plus facilement &#8364;
que &#x20AC;.


Le gros problème est que je n'ai pas réellement la maitrise de la base
dans le sens ou je ne peux pas (dois pas) modifier la structure et les
enregistrements existants, et j'aurais bien aimé éviter d'utiliser les
collate.
En fait, je n'ai pas tout précisé, à savoir que la base n'est pas
utilisée que pour l'intranet mais aussi par des applicatifs externes
(VB6), donc je suis obligé de garder la compatibilité (mon php doit
s'adapter).

Je regarderais lundi tes codes et me lancerais surement dans cette
****** de table de traduction.

P.S.: kr0$0ft is too bad :)


--
Tchattez en liberté: http://www.c-p-f.net
Tout sur les eggdrops: http://www.c-p-f.org
ML @

--


Avatar
Olivier Miakinen

mb_detect_encoding me ressort ASCII même si je lui indique de chercher
les autres encodages avant... et j'en ai testé un maximum


Ça c'est vraiment bizarre, et probablement un bug. Je testerai à l'occasion.

--

Avatar
Otto
In article <cknuf6$nms$, CrazyCat wrote:
J'ai même essayé de mettre dans ma requète SQL des "CONVERT USING..."
mais rien n'y fait (sqlserver n'apprécie pas du tout).

Essaye de poser cette question dans le newsgroups:

fr.comp.applications.sgbd

il y a des grourous la bas.

Moi je peux malheureusement pas t'aider.

Meilleures salutations

Otto

--

Avatar
HedererJS-free
Je me suis pas posé la question pour PHP, mais normalement il y a une
librairie GNU qui fait les conversions entre encodages différents:
libiconv. Regarde si il existe une librairie PHP. C'est très simple
d'utilisation normalement.


Il semblerait que les champs textes des bases soit encodés en
windows-1252 (CP1252) alors que je fonctionne (sur mon serveur web)
en ISO-8859-1.