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

Encodage de caractères et xml

8 réponses
Avatar
VenerZen
Hello,

Je me suis remis =E0 c++ assez r=E9cemment tout simplement parce que =E7a m=
e
plait et que =E7a r=E9pond pleinement =E0 mes besoins, cependant j'ai un
soucis et je ne sais pas comment faire.

En fait je voudrais extraire d'une base de donn=E9es sql serveur un
ensemble de textes et g=E9n=E9rer des fichiers xml. Mon probl=E8me est ici.
La base de donn=E9es est un windows-cp-1252 et les xml en utf8,
iso-8859-15, etc=85 en somme dans un type de codage de caract=E8res
diff=E9rent.

Comment vous vous y prenez pour effectuer les conversions ? je n'ai
pas trouv=E9 comment faire, hormis tenter de jouer avec le =ABsetlocale=BB.
Est-ce qu'il y a une autre mani=E8re de faire ? Je n'ai pas encore
commencer le d=E9veloppement, je ne fais qu'y r=E9fl=E9chir pour l'instant.

Merci pour vos remarques.

8 réponses

Avatar
Mickaël Wolff
VenerZen wrote:
Comment vous vous y prenez pour effectuer les conversions ? je n'ai
pas trouvé comment faire, hormis tenter de jouer avec le «setlocale».
Est-ce qu'il y a une autre manière de faire ? Je n'ai pas encore
commencer le développement, je ne fais qu'y réfléchir pour l'instant.


Le standard, ma connaissance, n'a pas de notion d'UTF-8. Il faut donc
utiliser une bibliothèque externe, telle que ICU.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Fabien LE LEZ
On Sat, 24 Oct 2009 04:19:29 -0700 (PDT), VenerZen
:

base de données sql serveur



Je ne connais pas ce système (à moins que tu ne parles de MS SQL
Server ?), mais je suppose qu'il implémente SQL.

La base de données est un windows-cp-1252



Le codage interne d'une base de données, on s'en fout. L'important,
c'est l'encodage des requêtes SQL et de leurs réponses.

Si tu as besoin de UTF-8, demande donc à ton serveur de parler en
UTF-8. Ça facilite énormément les choses, puisque tu n'as pas de
conversion à faire.
Pour MySQL, il suffit d'envoyer la requête suivante :
SET NAMES 'utf8';
Avatar
James Kanze
On Oct 24, 12:19 pm, VenerZen wrote:

En fait je voudrais extraire d'une base de données sql serveur
un ensemble de textes et générer des fichiers xml. Mon
problème est ici. La base de données est un windows-cp-1252
et les xml en utf8, iso-8859-15, etc… en somme dans un type de
codage de caractères différent.



Comment vous vous y prenez pour effectuer les conversions ? je
n'ai pas trouvé comment faire, hormis tenter de jouer avec le
«setlocale». Est-ce qu'il y a une autre manière de faire ? Je
n'ai pas encore commencer le développement, je ne fais qu'y
réfléchir pour l'instant.



S'il y a un locale qui convient, tu peux en principe l'utiliser
le codecvt facet ; si tu es en train de lire ou d'écrire avec
les iostream, tu pourrais l'imbuer dans le flux, et la
conversion se fera automatiquement. La façon classique ici, ce
serait d'utiliser les wiostream et wchar_t en interne.

Une autre possibilité, si tu n'arrives pas à trouver le bon
locale, serait d'utiliser une bibliothèque externe, comme iconv.

Enfin, si l'encodage d'entrée est single byte (c-à-d que chaque
encodage n'occupe qu'un seul octet), le plus simple, souvent,
c'est simplement un tableau de char const* const [256], avec le
caractère source (converti en unsigned char) comme indice.
L'initialisation de ce tableau est un peu fastidieux, avec plein
des entrées du genre "xC2xA9", mais c'est ça t'embête, ce
n'est pas trop difficile d'écrire un programme pour le générer,
à partir d'un format plus convivial.

--
James Kanze
Avatar
VenerZen
On 25 oct, 02:55, Mickaël Wolff wrote:
VenerZen wrote:
> Comment vous vous y prenez pour effectuer les conversions ? je n'ai
> pas trouvé comment faire, hormis tenter de jouer avec le «setlocale ».
> Est-ce qu'il y a une autre manière de faire ? Je n'ai pas encore
> commencer le développement, je ne fais qu'y réfléchir pour l'inst ant.

   Le standard, ma connaissance, n'a pas de notion d'UTF-8. Il faut d onc
utiliser une bibliothèque externe, telle que ICU.

--
Mickaël Wolff aka Lupus Michaelishttp://lupusmic.org



Ok, j'avais vu passer ça en installant boost et je me demandais
justement à quoi ça correspondait.

Merci.
Avatar
VenerZen
On 25 oct, 03:21, Fabien LE LEZ wrote:
On Sat, 24 Oct 2009 04:19:29 -0700 (PDT), VenerZen
:

>base de données sql serveur

Je ne connais pas ce système (à moins que tu ne parles de MS SQL
Server ?), mais je suppose qu'il implémente SQL.

>La base de données est un windows-cp-1252

Le codage interne d'une base de données, on s'en fout. L'important,
c'est l'encodage des requêtes SQL et de leurs réponses.

Si tu as besoin de UTF-8, demande donc à ton serveur de parler en
UTF-8. Ça facilite énormément les choses, puisque tu n'as pas de
conversion à faire.
Pour MySQL, il suffit d'envoyer la requête suivante :
        SET NAMES 'utf8';



Oui c'est MS Sql Server en version 2005 je crois. Je comptais m'y
connecter à partir d'un serveur FreeBSD via TDS.

Je ne sais pas s'il existe cette possibilité avec ce sgbdr. Je note ça
également. Merci.
Avatar
VenerZen
On 25 oct, 11:16, James Kanze wrote:
On Oct 24, 12:19 pm, VenerZen wrote:

> En fait je voudrais extraire d'une base de données sql serveur
> un ensemble de textes et générer des fichiers xml. Mon
> problème est ici.  La base de données est un windows-cp-1252
> et les xml en utf8, iso-8859-15, etc… en somme dans un type de
> codage de caractères différent.
> Comment vous vous y prenez pour effectuer les conversions ? je
> n'ai pas trouvé comment faire, hormis tenter de jouer avec le
> «setlocale».  Est-ce qu'il y a une autre manière de faire ? Je
> n'ai pas encore commencer le développement, je ne fais qu'y
> réfléchir pour l'instant.

S'il y a un locale qui convient, tu peux en principe l'utiliser
le codecvt facet ; si tu es en train de lire ou d'écrire avec
les iostream, tu pourrais l'imbuer dans le flux, et la
conversion se fera automatiquement. La façon classique ici, ce
serait d'utiliser les wiostream et wchar_t en interne.

Une autre possibilité, si tu n'arrives pas à trouver le bon
locale, serait d'utiliser une bibliothèque externe, comme iconv.

Enfin, si l'encodage d'entrée est single byte (c-à-d que chaque
encodage n'occupe qu'un seul octet), le plus simple, souvent,
c'est simplement un tableau de char const* const  [256], avec le
caractère source (converti en unsigned char) comme indice.
L'initialisation de ce tableau est un peu fastidieux, avec plein
des entrées du genre "xC2xA9", mais c'est ça t'embête, ce
n'est pas trop difficile d'écrire un programme pour le générer,
à partir d'un format plus convivial.

--
James Kanze



Je crois que j'ai encore un paquet de documentation à lire. Ça m'a
l'air complexe comme sujet. Merci.
Avatar
Olivier Miakinen
Le 26/10/2009 11:17, VenerZen a écrit :

Je crois que j'ai encore un paquet de documentation à lire. Ça m'a
l'air complexe comme sujet. Merci.



Commence quand même par vérifier l'hypothèse de Fabien LE LEZ : il y a
toutes les chances que sa méthode fonctionne, et c'est bien sûr la plus
simple.
Avatar
VenerZen
On 26 oct, 11:21, Olivier Miakinen <om+ wrote:
Le 26/10/2009 11:17, VenerZen a écrit :



> Je crois que j'ai encore un paquet de documentation à lire. Ça m'a
> l'air complexe comme sujet. Merci.

Commence quand même par vérifier l'hypothèse de Fabien LE LEZ : il y a
toutes les chances que sa méthode fonctionne, et c'est bien sûr la pl us
simple.



Oui, je n'y avais pas pensé. J'ai un premier projet a terminer et je
vais m'attaquer à celui-ci courant novembre.
Je fais ça surtout pour me remettre à niveau en c++, donc je n'ai pas
vraiment de contrainte.