IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

ecrire en arabe dans postgresql


Sujet :

PostgreSQL

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut ecrire en arabe dans postgresql
    * Bonjour, *

    comment ecrire dans la base de donnée en arabe dans postgresql 8.4 ?

    * Merci *

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    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.

  3. #3
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    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
    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

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    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.

  5. #5
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    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
    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

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    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.

  7. #7
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    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
    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

  8. #8
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    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
    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

  9. #9
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Séquence d'octets invalide pour l'encodage "UTF8"
    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 »


    L'erreur survient même si j'ai tenté de fixer le codage du client avec la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET CLIENT_ENCODING TO 'UTF8';
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET CLIENT_ENCODING TO 'SQL_ASCII';
    Est-ce que quelqu'un sait comment s'en sortir ?
    Vous postez du code ? Merci d'utiliser les balises
    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

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par TheGzD Voir le message
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Séquence d'octets invalide pour l'encodage "UTF8"
    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 »
    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.

  11. #11
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Citation Envoyé par estofilo Voir le message
    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.
    Oui je suis bien d'accord et c'est là le fond du problème (voir mes posts précédents).
    Maintenant ce qui m'intéresse c'est de savoir comment le résoudre ...
    Vous postez du code ? Merci d'utiliser les balises
    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

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Ton code applique WideCharToMultiByte() à la chaine contenant la requête SQL? Aux paramètres?

  13. #13
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    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
    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

  14. #14
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    séquence d'octets invalide pour l'encodage « UTF8 »
    Je ne vois vraiment pas comment m'en sortir ...
    Vous postez du code ? Merci d'utiliser les balises
    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

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Tu utilises un debugger?

  16. #16
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Voici les 2 fonctions qui permettent de passer de l'ASCII à de l'UTF8 :
    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;
    }
    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 ...

    En espérant que ça aidera.
    Vous postez du code ? Merci d'utiliser les balises
    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

Discussions similaires

  1. ecrire en arabe dans une base de données firebird
    Par chekkal dans le forum Firebird
    Réponses: 15
    Dernier message: 16/03/2014, 12h27
  2. Ecrire en arabe dans le contenue d'une page aspx?
    Par realtolive dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/04/2012, 00h44
  3. Ecrire en arabe dans un textbox
    Par inter_amine dans le forum Débuter
    Réponses: 0
    Dernier message: 12/10/2009, 14h11
  4. [CR ?] ecrire en arabe dans crystal report
    Par kira-3 dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 06/05/2009, 19h35
  5. [CS3] Ecrire en Arabe dans Dreamweaver
    Par stanley dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 24/01/2008, 11h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo