Enregistrer lire et modifier/écrire dans un fichier texte au format unicode

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 333 fois - Téléchargée 16 fois

Contenu du snippet

Ayant ramé pour trouver comment faire je vous offre cette petite source pour vous éviter de fastidieuses recherches... Pour gérer l'unicode sur une forme utilisez les contrôles de Bill Gates "Form 2.0" (FM20.DLL) voici la source pour ces contrôles : http://www.vbfrance.com/codes/UTILISER-CARACTERES-UNICODE-DANS-VB_23960.aspx

Source / Exemple :


'Version 1.1 réalisée avec Visual Basic 6.0

'Enregistrement du fichier texte au format unicode

Dim FF As Integer
FF = FreeFile 'Variable permettant de stocker un numéro de fichier libre
Open "C:\VotreFichier.txt" For Append As #FF
    Print #FF, "ÿþ" 'les caractères ÿþ signale que l'on enregistre le fichier au format unicode
Close #FF

'les caractères ÿþ n'apparaissent pas dans le fichier
'un saut de ligne est automatiquement créé lors de l'enregistrement il apparait sous la forme
'd'un carré

'Ecrire dans un fichier texte au format unicode

Dim Chaine, Chaine2 As String

SautDeLigne = StrConv(vbCrLf, vbUnicode) 'on prépare un saut de ligne en unicode
Chaine = "Du texte"
Chaine2 = "Un autre texte"
'On convertit les String en format unicode
Chaine = StrConv(Chaine, vbUnicode)
Chaine2 = StrConv(Chaine2, vbUnicode)
Open "C:\VotreFichier.txt" For Append As #FF
    Print #FF, Chaine 'on écrit une String
    Print #FF, SautDeLigne 'On saute une ligne sinon on a un fichier écrit sur une seule ligne
    Print #FF, Chaine2 'on écrit une autre String
    Print #FF, SautDeLigne 'et on n'oublie pas de sauter une ligne
Close #FF

'Il devrait y avoir un carré au début de chaque ligne du fichier

'Lire un fichier texte au format unicode

Dim inter, Chaine, Chaine2 As String
Open "C:\VotreFichier.txt" For Input As #FF
    Line Input #FF, inter 'On passe les caractères ÿþ
    Line Input #FF, inter 'On passe le saut de ligne qui est considéré comme une ligne
    Line Input #FF, Chaine 'On récupère une ligne
    Line Input #FF, inter 'On passe le saut de ligne qui est considéré comme une ligne
    Line Input #FF, Chaine2 'On récupère une ligne
Close #FF
'Si les chaines récupérées contiennent des caractères spéciaux elles seront illisibles
'Il va falloir convertir uniquement les caractères spéciaux grace au code suivant
Chaine = Convertisseur(Chaine)
Chaine2 = Convertisseur(Chaine2)

Private Function Convertisseur(ByVal Chaine As String) As String

Dim Intermediaire, Intermediaire2, Intermediaire3 As String
For i = 1 To Len(Chaine) 'boucle pour vérifier chaque caractère
    Intermediaire = Mid(Chaine, i, 1)
    If IsAlpha(Intermediaire) = True Then 'vérifie si le caractère est dans la table ascii
        Intermediaire2 = Intermediaire2 & Intermediaire 'si oui on ne convertit pas
    Else
        Intermediaire3 = StrConv(Intermediaire, vbFromUnicode) 'sinon on convertit depuis l'unicode ou autre selon vos besoins
        Intermediaire2 = Intermediaire2 & Intermediaire3
    End If
Next i
Convertisseur = Intermediaire2

End Function
Private Function IsAlpha(ByVal Caractere As String) As Boolean

Dim Code As Integer
On Error GoTo err
Code = Asc(Caractere) 'récupère le code ascii du caractère
If Code > 0 And Code < 256 Then 'si le code est compris entre 0 et 256
    IsAlpha = True 'alors c'est un caractère ascii
    Exit Function
End If
err:
IsAlpha = False 'sinon ce n'est pas le cas

End Function

Conclusion :


Voilà j'espère que cette source vous sera utile. Si vous trouve des bugs ou des erreurs faites m'en part!

Votre dévoué IceTdrinker ;)

A voir également

Ajouter un commentaire

Commentaires

PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
salut,

peux tu expliquer ton code et surtout tes choix?

*écrire des caractères unicode => il faut utiliser la fonction chrW

*ta fonction 'Convertisseur' => la fonction StrConv avec le bon argument s'en charge

*ta fonction 'IsAlpha' => pas besoin de tester toutes les valeurs en boucle, si <255 suffit. et idem, ascW existe aussi

*Dim SautDeLigne, Chaine, Chaine2 As String
SautDeLigne et Chaine sont alors des VARIANT

*manque un # au numéro d'ouverture de fichier

peux-tu expliquer un peu tout çà, là je ne vois pas au final ce que tu voulais faire. qui plus est comme tu ne testes pas avec un vrai fichier unicode...

merci
IceTdrinker
Messages postés
96
Date d'inscription
mercredi 27 août 2008
Statut
Membre
Dernière intervention
9 mai 2012

Pourquoi avoir désactivé ma source? je n'ai pas eu le temps de répondre hier... laissez un délai un peu plus long SVP
Sinon

*la fonction chrW est bien sympa mais elle n'est pas pratique lorsque l'on veut enregistrer des chaines de caractères puisqu'elle ne fait que générer un caractère à partir d'un code compris entre 0 et 256 un peu comme la fonction Chr simple

*ma fonction 'Convertisseur' permet d'éviter d'avoir des idéogrammes chinois lorsque les caractères sont convertis sans se poser de questions avec StrConv à partir de l'unicode

*effectivement pour IsAlpha j'ai fais une belle gaffe, j'utilise asc par préférence.

*Pour SautDeLigne c'est une erreur de ma part, Chaine et Chaine2 sont en fait les variables que l'on souhaite enregistrer dans le fichier

*le # n'est pas utile dans ma version de VB il ne plante pas. mais je peux le rajouter si celà te semble utile.

et puis je teste avec un fichier texte unicode puisque les caractères ÿþ font que le fichier s'enregistre au format unicode donc voilà je vais modifier les erreurs et j'espère que ma source sera débloquée!
PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
ta source est réactivée

chrW => (MSDN)
Les nombres compris entre 0 et 31 sont identiques aux codes standard ASCII non imprimables.
Toutefois, sur des systèmes DBCS, la valeur de l'argument charcode peut être comprise entre -32768 et 65535.

convertisseur, tu parles d'affichage ou de format de stockage des caractères?

# n'est pas indispensable dans l'absolu mais c'est une question de cohérence syntaxique simplement. de même tu devrais passer par une variable et non un chiffre (1) en dur ; variable implémentée par la fonction FreeFile

en attente des suites si possible ;)
++
PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
petit exemple avec du texte 'normal' et de l'unicode.
le fichier est bien reconnu de type unicode

Private Sub Command1_Click()
Dim FF As Integer, abChars() As Byte

' num fichier
FF = FreeFile

' ouverture binaire
Open "C:\VotreFichier.txt" For Binary Access Write As #FF

' header ReDim abChars(1): abChars(0) &HFF: abChars(1) &HFE
Put #FF, , abChars

' ligne 1 - ANSI
abChars = "Du texte" & vbCrLf
Put #FF, , abChars

' ligne 2 - UNICODE
abChars = ChrW$(&H3088) & ChrW$(&H3046) & ChrW$(&H3053) & ChrW$(&H305D) & StrConv(vbCrLf, vbUnicode)
Put #FF, , abChars

' ligne 3 - ANSI
abChars = "Un autre texte"
Put #FF, , abChars

' fermeture
Close #FF
Erase abChars
End Sub
IceTdrinker
Messages postés
96
Date d'inscription
mercredi 27 août 2008
Statut
Membre
Dernière intervention
9 mai 2012

Merci pour l'info sur chrW!
Le convertisseur en fait c'est pour pouvoir afficher les caractères correctement au lieu d'avoir des surprises du type caractères chinois (ça m'est arrivé) ou d'avoir de jolis carrés illisibles pout tout humain normalement constitué :)
Pour FreeFile je connais mais je tire ce code d'un programme à moi qui ne peut pas avoir plus d'un fichier ouvert en même temps, mais je vais modifier ça pour des raisons de praticité (ça se dit?). Pour ton exemple mon problème est que je ne suis pas initié aux accès fichier en type binaire... Je vais chercher et peut-être que je ferai 2 exemples un en accès "classique" et un autre en accès binaire. Et pour les suites aucun problème je suis ouvert à toute critique constructive!
A+ et merci!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.