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

PL/SQL Oracle Discussion :

Appliquer un encodage / décodage / charset (russe) à une chaine Latin ? (ascii <-> Unicode)


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut Appliquer un encodage / décodage / charset (russe) à une chaine Latin ? (ascii <-> Unicode)
    Bonjour,

    J'ai des anciennes applications (Delphi et C++) qui communiquent avec une BDD Oracle.

    La BDD est paramétré depuis très longtemps comme ceci :

    NLS_CHARACTERSET = WE8MSWIN1252
    Il y a 20/25 ans, l'unicode n'existait pas

    Les applications fonctionnent à l'international, soit :
    - Le français
    - L'anglais
    - Le chinois simplifié
    - Le russe
    ...

    Les chaines sont toutes stockées dans des VARCHAR2(...)

    Comme toutes les chaines sont stockées en caractères LATIN (CodePage 1252), un
    charset (jeu de caractère) est appliqué dans l'application : PAS DE PROBLEME avec Delphi 6 ou C++

    Pour vous donner une idée :
    Insérer du russe dans Word (unicode) : рождество
    Enregistrer le fichier en texte brut puis sélectionner le codage Cyrillique (Windows)
    => Ce qui est enregistré dans le fichier, c'est ce qui est enregistré dans le VARCHAR2 de la BDD : ðîæäåñòâî


    AUCUN PROBLEME avec Delphi ou C++.
    Pour les versions plus récentes de Delphi ou C++ qui gère maintenant l'unicode, ce n'est pas un charset qui
    est appliqué mais un encodage / décodage des chaines.

    Encoding encLatin = Encoding.GetEncoding(1252); //latin

    Encoding encRusse = Encoding.GetEncoding(1251); //cyrilique

    chaineCible = new string(encRusse.GetChars(encLatin.GetBytes(chaineSource)));

    //chaineCible = unicode : ok
    --------------------------------------------------------------------------------------------
    Aujourd'hui, je dois créer une PL/SQL qui extrait une chaine VARCHAR2 qui contient du russe.
    Puis enregistrer la chaine dans un fichier, en UNICODE.

    Comment effectuer l'encodage / décodage en PL/SQL ?

    J'ai cherché du côté de la fonction CONVERT mais ça ne fait pas ce que je souhaite.
    C'est à dire transformer la chaine latin (russe) ðîæäåñòâî en unicode рождество

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Vous devez utiliser utl_raw pour convertir, probablement en deux étapes: latin vers cyrilique (ex à vérifier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select utl_raw.cast_to_raw('Ðîæäåñòâî'),
           utl_raw.convert(utl_raw.cast_to_raw('Ðîæäåñòâî'),'RUSSIAN_CIS.CL8MSWIN1251','FRENCH_FRANCE.WE8MSWIN1252')
      from dual
    puis en utf et écrire dans un fichier ouvert en binaire via la fonction utl_file.put_raw

  3. #3
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut
    Euh, je n'arrive pas à arriver ça : рождество

    Exemple testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select utl_raw.cast_to_varchar2(utl_raw.convert(utl_raw.cast_to_raw('ðîæäåñòâî'),'RUSSIAN_CIS.CL8MSWIN1251','FRENCH_FRANCE.WE8MSWIN1252')) from dual

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Pourriez-vous via la fonction sql dump afficher en hexa la chaine des caractères stockées en base qui représente рождество? Est-ce en fait Ðîæäåñòâî ou ðîæäåñòâî ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select dump('Ðîæäåñòâî',16)
      from dual

  5. #5
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut
    C'est bien ceci ðîæäåñòâî qui est enregistré en BDD.

    A l'affichage de l'écran delphi, je visualise "рождество".

    En effectuant un dump sur le champ, j'ai :

    SELECT DUMP(NomProduit)
    FROM PRODUITS
    WHERE CodeProduit = '151841'
    Résultat : Typ=1 Len=11: 240,238,230,228,229,241,242,226,238

  6. #6
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut
    SELECT DUMP(NomProduit, 16)
    FROM PRODUITS
    WHERE CodeProduit = '151841'
    Résultat : Typ=1 Len=11: f0,ee,e6,e4,e5,f1,f2,e2,ee

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Pourriez-vous me donner l'équivalent en hexa de la chaine résultat "рождество" ?

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Comme je vous aie dit vous devez utiliser la fonction ult_raw.convert et écrire en binaire dans votre fichier.
    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
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
    Connected as mni
     
    SQL> 
    SQL> select dump('ðîæäåñòâî', 16),
      2         utl_raw.convert(utl_raw.cast_to_raw('ðîæäåñòâî'),'RUSSIAN_CIS.UTF8','RUSSIAN_CIS.CL8MSWIN1251')
      3  from dual
      4  /
     
    DUMP('ÐÎÆÄÅÑÒÂÎ',16)                     UTL_RAW.CONVERT(UTL_RAW.CAST_T
    ---------------------------------------- --------------------------------------------------------------------------------
    Typ=96 Len=9: f0,ee,e6,e4,e5,f1,f2,e2,ee D180D0BED0B6D0B4D0B5D181D182D0B2D0BE
     
    SQL>
    en Base......Hexa.....CIS.........Unicode
    ð................F0.........p............D1 80
    î.................EE.........о............D0 BE
    æ...............E6.........ж...........D0 B6
    ä................E4.........д............D0 B4
    ...

Discussions similaires

  1. Décodage d'une chaine en base 64
    Par hpalpha dans le forum Contribuez
    Réponses: 0
    Dernier message: 13/02/2011, 17h29
  2. Encodage d'une chaine en base 64
    Par hpalpha dans le forum Contribuez
    Réponses: 0
    Dernier message: 13/02/2011, 17h28
  3. Chercher dans une chaine le type d'encodage
    Par Christophe Charron dans le forum Langage
    Réponses: 2
    Dernier message: 04/10/2007, 14h03
  4. Réponses: 9
    Dernier message: 14/03/2006, 15h34
  5. [Débutant]Encodage d'une chaine de caractères
    Par Crazyblinkgirl dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/08/2004, 16h47

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