Unicode vers ANSI (VB6)

cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012 - 11 juin 2008 à 20:47
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012 - 12 juin 2008 à 20:20
Bonjour,

J'ai plusieurs fois récupéré une 'séquence string' basé sur Unicode (dans le champ Commentaire d'un ID3v2), mais je n'arrive pas à le convertir au format ANSI. Je précise que cette séquence string ne contient que des caractères ... usuels de chez nous (pas de symboles chinois ou autres).
La conversion de Unicode vers ANSI par StrConv(...) ne fonction pas (j'ai Win XP FR).

A lire différents foums, je n'ai pas trouvé de solution et je fais peut-être fausse route.

Dans le cas contraire, j'ai 'capturé' la séquence Unicode dans une variable appelé 'Essai'.

Ouvrez un nouveau projet, placez-y un controle Text1 (MultiLine=TRUE), et 2 bouton de commandes Command1 et command2.
Puis collez le code suivant :

Dim Essai As String

Private Sub Form_Load()
    Essai = Chr(0) + Chr(255) + Chr(254) + Chr(98)
    Essai = Essai & Chr(0) + Chr(121) + Chr(0) + Chr(32) + Chr(0) + Chr(84)
    Essai = Essai & Chr(0) + Chr(75) + Chr(0) + Chr(32) + Chr(0) + Chr(38)
    Essai = Essai & Chr(0) + Chr(32) + Chr(0) + Chr(73) + Chr(0) + Chr(110)
    Essai = Essai & Chr(0) + Chr(116) + Chr(0) + Chr(101) + Chr(0) + Chr(114)
    Essai = Essai & Chr(0) + Chr(99) + Chr(0) + Chr(101) + Chr(0) + Chr(112)
    Essai = Essai & Chr(0) + Chr(116) + Chr(0) + Chr(111) + Chr(0) + Chr(114)
    Essai = Essai & Chr(0) + Chr(13) + Chr(0) + Chr(10) + Chr(0) + Chr(48)
    Essai = Essai & Chr(0) + Chr(32) + Chr(0) + Chr(87) + Chr(0) + Chr(111)
    Essai = Essai & Chr(0) + Chr(99) + Chr(0) + Chr(104) + Chr(0) + Chr(101)
    Essai = Essai & Chr(0) + Chr(110) + Chr(0) + Chr(32) + Chr(0) + Chr(80)
    Essai = Essai & Chr(0) + Chr(108) + Chr(0) + Chr(97) + Chr(0) + Chr(116)
    Essai = Essai & Chr(0) + Chr(122) + Chr(0) + Chr(32) + Chr(0) + Chr(49)
    Essai = Essai & Chr(0) + Chr(13) + Chr(0) + Chr(10) + Chr(0) + Chr(49)
    Essai = Essai & Chr(0) + Chr(51) + Chr(0) + Chr(32) + Chr(0) + Chr(87)
    Essai = Essai & Chr(0) + Chr(111) + Chr(0) + Chr(99) + Chr(0) + Chr(104)
    Essai = Essai & Chr(0) + Chr(101) + Chr(0) + Chr(110) + Chr(0) + Chr(32)
    Essai = Essai & Chr(0) + Chr(105) + Chr(0) + Chr(110) + Chr(0) + Chr(32)
    Essai = Essai & Chr(0) + Chr(100) + Chr(0) + Chr(101) + Chr(0) + Chr(114)
    Essai = Essai & Chr(0) + Chr(32) + Chr(0) + Chr(84) + Chr(0) + Chr(111)
    Essai = Essai & Chr(0) + Chr(112) + Chr(0) + Chr(32) + Chr(0) + Chr(49)
    Essai = Essai & Chr(0) + Chr(48) + Chr(0)
    ' Le contenu complet de Essai est supposé codé en Unicode.
    ' Le résultat devrait être les 3 lignes suivantes:
    '   by TK & Interceptor
    '   0 Wochen Platz 1
    '   13 Wochen in der Top 10

    'Text1.MultiLine = True 'Manuellement !
    Text1.Text = Essai
End Sub

Private Sub Command1_Click()
    ' La conversion 'brut' par StrConv ne me donne qu'une
    ' série de ????? (avec quelques espaces entre)
    Text1.Text = StrConv(Essai, vbFromUnicode)
End Sub

Private Sub Command2_Click()
    ' La conversion 'maison' (ConversionUnicode) n'est
    ' qu'un bricolage et ne fonctionne QUE dans ce cas :
    Text1.Text = ConversionUnicode(Essai)
End Sub

Function ConversionUnicode(myString As String) As String
Dim myTmp As String
        '# Post-traitement spécial (bricolage !!!):
        If Len(myString) > 2 Then
            If Left(myString, 1) = Chr(0) Then
                myTmp = Right(myString, Len(myString) - 1)
            End If
        Else
            ConversionUnicode = myString
            Exit Function
        End If

        myTmp = StrConv(myTmp, vbFromUnicode)
        'Pour retirer le premier '?' -> encore du bricolage :
        myTmp = Right(myTmp, Len(myTmp) - 1)
        ConversionUnicode = myTmp
End Function

Ma question donc : Peut-on convertir ma variable 'Essai ' pour qu'elle soit affichable, sans passer par mon bricolage (Command2) ?
titicar

2 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 juin 2008 à 21:31
Essai = Chr(0) + Chr(255) + Chr(254) + Chr(98)

ta chaile commence par "ÿ" ( Chr(0) + Chr(255) )

ensuite tu as: Chr(254) + Chr(98) au lieu de Chr(0) + Chr(98) pour le "b".

La fin d'une chaine unicode est faite de 2 zéros, pas d'1 seul. Tous les caractères doivent être sur 2 octets.

ciao...
BruNews, MVP VC++
0
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
12 juin 2008 à 20:20
BruNews:

Bien vu pour le 'b' avec Chr(0) et non pas chr(254), mais même en ajoutant un chr(0) à la fin de la séquence dans la variable Essai, l'instruction StrConv(Essai, vbFromUnicode) continue de m'afficher une série de '?'.

De toute manière et en lisant les forums, je m'apercois qu'un controle usuel affichant du texte sous VB6 ne permet pas d'afficher tous les caractères de l'Unicode.
Je vais donc sans doute me contenter de lire des caractères avec chr(0) en premier octet. Et vu que je ne sais pas quoi faire avec StrConv(...), je ferai un truc maison du genre:

Function ConversionSemblantUnicode(myString As String) As String
Dim myTmp As String, X As Long, myTmp1 As String
   
    '# Supprime les 2 premiers octets, définissant la norme? :
    myTmp = Right(myString, Len(myString) - 2)

    '# Conversion (caractère sur 2 octets vers caractère sur 1 octet)
    'myTmp = StrConv(myTmp, vbNarrow) '-> Ben non, ça marche pas.
    For X = 2 To Len(myTmp) Step 2
        myTmp1 = myTmp1 & Mid(myTmp, X, 1)
    Next X
    '! Reste à voir les 2 derniers octets Chr(0)

    '# Affectation de la fonction:
    ConversionSemblantUnicode = myTmp1
End Function

Mais si tu as d'autres suggestions...

titicar
0
Rejoignez-nous