none
comment changer ces caractères? RRS feed

  • Question

  • Bonjour,

    J'ai créé  un fichier texte avec VB 2008.

    Si j'ouvre ce fichier avec Notepad, les caractères accentués apparaissent normalement;

    Quant à Word, il me faut choisir "unicode UTF-8" pour le même résultat.

    Par contre, si veux exploiter ce fichier avec Access (ver.2003), je récupère ces caractères comme suit :

    La Dernière légion

    Il me semble cela a un rapport avec UTF8 et UTF7.

    Mais je sais pas comment l'exploiter?


    • Modifié papyx lundi 3 octobre 2011 09:31
    dimanche 2 octobre 2011 17:12

Réponses

Toutes les réponses

  • Bonjour,

    Il faut faire un imports de "System.Text" et l'utilisation pourrais ce faire comme suit :

            Dim oLecture As New StreamReader("Myfile.Txt", Encoding.UTF8)
    

     

    Cela répond a votre question ?

     

    A bientôt

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    dimanche 2 octobre 2011 18:14
    Auteur de réponse
  • Bonjour,

    Pouvez-vous nous montrer le code qui lit les caractères ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 2 octobre 2011 18:42
    Modérateur
  • Bonjour papyx,

    Je viens juste d'avoir le même problème, dans mon cas il fallait décoder le texte UTF8, j'ai utilisé ce bout de code qui peut peut-être servir :

     Public Function Decode(ByVal strUTFString As String) As String
            Dim bytString() As Byte = StringToByteArray(strUTFString)
            Dim chrChars() As Char
            Dim i
            chrChars = System.Text.Encoding.UTF8.GetChars(bytString)
            Decode = ""
            For i = 0 To UBound(chrChars)
                Decode += chrChars(i)
            Next
        End Function
        Private Function StringToByteArray(ByVal strString As String) As Byte()
            Dim bytBuffer() As Byte
            Dim i
            ReDim bytBuffer(Len(strString) - 1)
            For i = 0 To UBound(bytBuffer)
                bytBuffer(i) = CByte(Asc(Mid(strString, i + 1, 1)))
            Next
            Return bytBuffer
        End Function
    

    A utiliser comme cela :

    Dim leNouveauTexte As String = Decode(lancienTexte)

    Bonne soirée.


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement - Best Regards. Contact
    dimanche 2 octobre 2011 19:02
  • Bonjour,

    Le code que vous montrez n'est pas correct et fortement déconseillé d'utiliser. En .NET, toute chaîne est obligatoirement en UTF-16 !!! (cf. la documentation Microsoft). Si vous obtenez des caractères incorrect dans ces chaines c'est que le processus de chargement de vos chaînes en amont (depuis un fichier, SGBD,...) n'utilise pas le bon encodage.

    Voici un article qui explique le concept des chaines de caractères sous .NET : http://gilles.tourreau.fr/dotnet_framework/dotnet-comprendre-le-concept-de-la-gestion-du-codage-des-caracteres-sous-dotnet.html

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 2 octobre 2011 19:07
    Modérateur
  • Bonsoir Gilles, En effet ces fonctions sont à éviter..dans mon cas le texte venait d'une dll native et était encodé en UTF8. Le résultat était donc à peu près correct, mais je vais revoir tout ça. Bonne soirée.
    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement - Best Regards. Contact
    dimanche 2 octobre 2011 20:46
  • Voila le code qui lit un fichier texte dan Access (VB6.3) :

     

    Sub chargmt(fic As String)
        Dim nf%, n%, f$, g$, t$, i%, ori$
        Const lt% = 60  'long du titre
        Const lg% = 30  'long du genre (ou dossier)
        Open fic For Input As #1
        Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
            Input #1, zz   ' Lit les données dans des variables.
            n% = n% + 1
            If n% = 1 Then
                i% = InStr(1, zz, "sur") + 4
                ori$ = Mid(zz, i%)
            End If
            If Len(zz) > 0 And n% > 2 Then
                '        i% = InStr(50, zz, " ")
                f$ = RTrim(Left(zz, lt%))
                If Len(f$) = lt% Then MsgBox f$
                g$ = Trim(Mid(zz, lt% + 1, lg%))
                t$ = Trim(Mid(zz, lt% + lg% + 1))
                
    If Right(f$, 3) = "DVD" Then f$ = RTrim(Left(f$, 50)): t$ = Trim(Mid(zz, 82))
                
                If t$ = "" Then
                ElseIf Not existe(f$) Then
                    '        Debug.Print f$
                    nf% = nf% + 1
                    runsql "INSERT INTO films  (titre,norep,origine,taille) VALUES (""" & _
                    f$ & """,0,""" & ori$ & """,""" & t$ & """);"
                ElseIf t$ = "" Then
                ElseIf rs("taille") <> t$ Then
                    runsql "UPDATE fILMS SET TAILLE='" & t$ & "' WHERE titre=""" & f$ & """;"
                End If
    
                If Len(g$) < 2 Then
                ElseIf Not rpath(g$) Then
     '               runsql "INSERT INTO path  (voie) VALUES ('" & g$ & "');"
      '              runsql "UPDATE fILMS SET norep='" & norep & "' WHERE titre=""" & f$ & """;"
                End If
    
            End If
        Loop
        Debug.Print Str(nf%) & " films"
        Close #1    ' Ferme le fichier.
    End Sub
    


     


    • Modifié papyx lundi 3 octobre 2011 09:00
    lundi 3 octobre 2011 08:14
  • A Xavier,

    je ne sais pas faire l'import de "System.Text".

    Je suppose que c'est dans "Références", mais je ne trouve pas.

    lundi 3 octobre 2011 08:59
  • bonjour Papyx,

    Il suffit de faire Imports System.Text en haut dans la partie code :

    Inutile d'ajouté la référence.

    Aprioris ce n'est pas la seul chose a faire en lisant les messages de Mikaël et Gilles ...

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    lundi 3 octobre 2011 09:56
    Auteur de réponse
  • J'ai essayé, mais j'ai une erreur de compilation: "interdit en dehors d'une procédure";

    Il se peut qu'en VB(6.3) , cela ne marche pas !?


    Alain D
    lundi 3 octobre 2011 11:05
  • Alain,

    Voici un exemple:

    j'ai créé un fichier a la racine de C:\ dedans j'ai mis :

    é
    à
    ê
    ô
    è

     

    Le code qui va lire le fichier :

     

     

    Imports System.Text
    Imports System.IO
    
    
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim Lecture As New StreamReader("C:\MonFichier.txt", Encoding.UTF7)
            Console.WriteLine(Lecture.ReadToEnd)
        End Sub
    End Class
    

    Résultat de la sortie :

     

     

    é
    à
    ê
    ô
    è


     

     

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    lundi 3 octobre 2011 12:46
    Auteur de réponse
  • Xavier

    comme je te l'ai indiqué précédemment, en VB6.3 l'import ne fonctionne pas comme dans ta démo.


    Alain D
    lundi 3 octobre 2011 12:53
  • Ha pardon j'avais pas trop compris :)

    Pour VB6 il faudra aller sur ce forum VB6 pour avoir plus de chance


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    lundi 3 octobre 2011 13:40
    Auteur de réponse
  • ok merci
    Alain D
    lundi 3 octobre 2011 14:03