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

VB 6 et antérieur Discussion :

Lire des caractères encodés en UTF8


Sujet :

VB 6 et antérieur

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut Lire des caractères encodés en UTF8
    Bonjour,

    Je suis face à un petit problème d'encodage de caractères en UTF8, en VB classique.

    J'ai un fichier XML généré en UTF8, que j'utilise ensuite dans une zone de texte.
    Pas de problème particulier pour les caractères "classiques", j'ai trouvé une petite fonction qui fonctionne très bien, utilisant la fonction MultiByteToWideChar.

    Là où ça se corse, c'est que certains fichiers générés comportent des caractères spéciaux (caractères grecs, ce qui donne des trucs du genre : EKINOXE ΠΟΡΤΑ ΔΙΑΦΑΝΗ). La création du fichier fonctionne très bien, mais quant à la lecture de ce dernier, impossible d'afficher les caractères spéciaux correctement.

    Je vous donne la fonction complète utilisée pour le décodage 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
     
    Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
     
    Private Const CP_UTF8 = 65001
     
    Public Function UTF8_Decode(ByVal wText As String) As String
        Dim vNeeded As Long
        Dim vSize   As Long
        vSize = Len(wText)
        vNeeded = MultiByteToWideChar(CP_UTF8, 0, wText, vSize, 0, 0)
        UTF8_Decode = String(vNeeded, 0)
        MultiByteToWideChar CP_UTF8, 0, wText, vSize, StrPtr(UTF8_Decode), vNeeded
    End Function
    Ma question est la suivante : existe t'il un moyen plus robuste pour afficher ce genre de caractère, ou dois je me faire à l'idée de voir des "?" un peu partout à l'affichage ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    C'est peut-être la police utilisée qui ne peut afficher tous les caractères. Par exemple si tu utilises Arial latin, tu n'auras pas le résultat souhaité. Par contre, si tu utilises Arial cirilique (je crois), ça devrais marcher.

    Ceci dit, j'ai trouvé ceci dans l'aide de VB:
    How to Change the Font at Run Time
    Even though you have the options above, these solutions have restrictions. Here is an example of a global solution to changing the font in your application at run time. The following code, which works in any language version of Windows, applies the proper font to the Font object specified in the argument.

    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
    Private Const DEFAULT_CHARSET = 1
    Private Const SYMBOL_CHARSET = 2
    Private Const SHIFTJIS_CHARSET = 128
    Private Const HANGEUL_CHARSET = 129
    Private Const CHINESEBIG5_CHARSET = 136
    Private Const CHINESESIMPLIFIED_CHARSET = 134
    Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
     
    Public Sub SetProperFont(obj As Object)
        On Error GoTo ErrorSetProperFont
        Select Case GetUserDefaultLCID
        Case &H404 ' Traditional Chinese
            obj.Charset = CHINESEBIG5_CHARSET
            obj.Name = ChrW(&H65B0) + ChrW(&H7D30) + ChrW(&H660E) _
             + ChrW(&H9AD4)   'New Ming-Li
            obj.Size = 9
        Case &H411 ' Japan
            obj.Charset = SHIFTJIS_CHARSET
            obj.Name = ChrW(&HFF2D) + ChrW(&HFF33) + ChrW(&H20) + _
             ChrW(&HFF30) + ChrW(&H30B4) + ChrW(&H30B7) + ChrW(&H30C3) + _
             ChrW(&H30AF)
            obj.Size = 9
        Case &H412 'Korea UserLCID
            obj.Charset = HANGEUL_CHARSET
            obj.Name = ChrW(&HAD74) + ChrW(&HB9BC)
            obj.Size = 9
        Case &H804 ' Simplified Chinese
            obj.Charset = CHINESESIMPLIFIED_CHARSET
            obj.Name = ChrW(&H5B8B) + ChrW(&H4F53)
            obj.Size = 9
        Case Else   ' The other countries
            obj.Charset = DEFAULT_CHARSET
            obj.Name = ""   ' Get the default UI font.
            obj.Size = 8
        End Select
        Exit Sub
    ErrorSetProperFont:
        Err.Number = Err
    End Sub
    You can modify this sample code to make the font apply to other font settings, such as printing options.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Merci pour ta réponse, c'etait effectivement une bonne piste possible à laquelle je n'avais pas pensé.

    Hélas après plusieurs essais (modification de la police du champ), il s'avère que cela vient bien de la gestion de VB en lui même, qui n'arrive pas à envoyer les bons caractères au champ.

Discussions similaires

  1. Lire des caractères spéciaux dans un fichier
    Par pierre5897 dans le forum Débuter
    Réponses: 17
    Dernier message: 22/08/2013, 22h54
  2. Éviter de lire des caractères avec fscanf()
    Par Self-Mao dans le forum C
    Réponses: 3
    Dernier message: 02/05/2013, 09h39
  3. xslt : transformation des caractères encodés
    Par snopims dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 06/05/2009, 13h15
  4. [Unicode] Comment lire des caractères ?
    Par Mickey974 dans le forum Delphi
    Réponses: 7
    Dernier message: 14/04/2007, 14h53
  5. lire des caractères
    Par soria_t dans le forum C
    Réponses: 5
    Dernier message: 23/02/2007, 12h20

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