* Bonjour, *
comment ecrire dans la base de donnée en arabe dans postgresql 8.4 ?
* Merci *
* Bonjour, *
comment ecrire dans la base de donnée en arabe dans postgresql 8.4 ?
* Merci *
PostgreSQL supporte de base l'Unicode avec encodage UTF8 qui comprend toutes les langues et alphabets. Il n'y a rien de spécial à activer.
Comment passer ce type de requêtes (codées en Unicode) en utilisant libpq ?
Merci d'avance.
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
Les fonctions de libpq transmettent les requêtes au serveur et reçoivent les résultats sans encoder ni décoder, donc elles ne sont pas vraiment concernées par l'encodage. C'est-à-dire elles sont "transparentes" par rapport à l'encodage, c'est à l'appelant de s'en occuper.
Mon soucis réside dans le fait que les chaines de caractères sont stockées en char (qui permettent de stocker une informations au format ANSI) dans les structures et fonctions utilisées par libpq.
Que faut-il donc faire pour passer de l'Unicode (type wchar_t) ?
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
A propos d'Unicode, il faut faire le distinguo entre le jeu de caractères (Unicode) et l'encodage qui peut être utf8, utf16 ou ucs-2, utf32 ou ucs-4, et pour les deux derniers avec deux variantes: avec les octets dans l'ordre little endian ou dans l'ordre big endian.
wchar_t, c'est de l'Unicode dans un encodage qui peut être un de ceux ci-dessus, mais on ne sait pas lequel, ça dépend du compilateur. Par comparaison, c'est un peu comme la taille d'un entier qui peut être 16 (vieux systèmes) ou 32 ou 64 bits, voire plus.
Bref il n'y a pas une manière simple et portable de convertir les chaines caractères typées en wchar_t en suite d'octets UTF8.
Sous Windows on va avoir tendance à utiliser WideCharToMultiByte(), sous Unix peut-être iconv avec WCHAR_T comme type source, ou des routines faites soi-même à base de librairie standard C++ comme on peut trouver ici:
http://pileborg.org/blog5.php/2010/0...-8-and-wchar_t
Personnellement, j'utilise Qt qui lit et écrit de l'utf8 de manière simple et qui est portable, ça peut aussi être une solution, ça dépend du projet.
En clair, il devrait suffire de caster sauvagement mes wchar_t en char quand je fais mes appels pour que ça passe ?
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
Après lecture de la doc de WideCharToMultiByte() il semble que ce soit en effet ce qu'il me faille. J'avais, dans un premier temps, cru comprendre qu'il s'agissait d'une conversion "sémantique", mais ça ne semble pas être le cas.
Je teste et si ce n'est pas ça, je reviendrai pleurnicher
Merci pour l'aide.
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
Erf j'ai un petit soucis :s
Pour l'instant je n'ai pas encore passé mon application en arabe, mais je présume que si j'arrive à traiter du français en Unicode il n'y aura plus rien à faire. C'est donc ce que je m'efforce de faire actuellement.
Seul problème dès que je transmet une requête avec un caractère accentué ou une cédille j'obtiens le message d'erreur suivant :
ou plus exactement (mais moins lisible) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Séquence d'octets invalide pour l'encodage "UTF8"
Code : Sélectionner tout - Visualiser dans une fenêtre à part séquence d'octets invalide pour l'encodage « UTF8 »
L'erreur survient même si j'ai tenté de fixer le codage du client avec la requête :
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part SET CLIENT_ENCODING TO 'UTF8';
Est-ce que quelqu'un sait comment s'en sortir ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part SET CLIENT_ENCODING TO 'SQL_ASCII';
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
Ca veut dire que la requête envoyée au serveur n'est pas en UTF8.
Pour le message d'erreur avec le problème d'accents, c'est le même problème en sens inverse: le message est en UTF8 mais l'application qui l'affiche n'est pas réglée sur de l'UTF8, d'où les accents qui sont remplacés par une séquence de caractères incorrecte.
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
Ton code applique WideCharToMultiByte() à la chaine contenant la requête SQL? Aux paramètres?
Oui, je convertis tous les wchar_t en char à l'aide de cette fonction avant de les envoyer à la BDD.
Pour ce qui est des retours (tels que les messages d'erreur) je leur fait subir la conversion inverse à l'aide de MultiByteToWideChar.
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
J'ai eu beau cherché j'ai toujours le même soucis : j'ai une chaîne ANSI qui contient quelques caractères en UTF8, par exemple :
Je ne vois vraiment pas comment m'en sortir ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part séquence d'octets invalide pour l'encodage « UTF8 »
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
Voici les 2 fonctions qui permettent de passer de l'ASCII à de l'UTF8 :
C'est vraiment très sale de mettre de l'UTF8 dans un char qui n'est sensé contenir que de l'ANSI contrairement au wchar_t qui lui est destiné àl'UNICODE .. mais bon faute de mieux ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 char * Utf8toAnsi(const char * utf8, int len) { char * ansistr = NULL; int length = MultiByteToWideChar(CP_UTF8, 0, utf8, len, NULL, NULL); WCHAR * lpszW = NULL; lpszW = new WCHAR[length+1]; ansistr = (char *)calloc(sizeof(char), length+1); //this step intended only to use WideCharToMultiByte MultiByteToWideChar(CP_UTF8, 0, utf8, -1, lpszW, length); lpszW[length] = '\0'; //Conversion to ANSI (CP_ACP) WideCharToMultiByte(CP_ACP, 0, lpszW, -1, ansistr, length, NULL, NULL); ansistr[length] = '\0'; delete[] lpszW; return ansistr; } char * AnsitoUtf8(const char * ansi, int len) { char * utf8str = NULL; int length = MultiByteToWideChar(CP_ACP, 0, ansi, len, NULL, NULL); WCHAR * lpszW = NULL; lpszW = new WCHAR[length+1]; utf8str = (char *)calloc(sizeof(char), 2*(length+1)); //this step intended only to use WideCharToMultiByte MultiByteToWideChar(CP_ACP, 0, ansi, -1, lpszW, 2*length); lpszW[length] = '\0'; //Conversion to ANSI (CP_ACP) WideCharToMultiByte(CP_UTF8, 0, lpszW, -1, utf8str, 2*length, NULL, NULL); utf8str[2*length] = '\0'; delete[] lpszW; return utf8str; }
En espérant que ça aidera.
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager