2012-05-04 13 views
8

Ich muss eine Textdatei in VB6 schreiben. Ich muss es anhängen und utf-8 kodieren.Schreibe Textdatei in Anhängen (UTF-8 codiert) in VB6

Ich habe zwei Lösungen ausprobiert, eine mit "TextStream" und eine andere mit "ADODB.Stream".

Die erste:

Set fsoFile = fso.OpenTextFile(FileIn(fi), ForAppending, True) 
    fsoFile.WriteLine "<tag>kkkjòòkkkkjlòlk</tag>" 
    fsoFile.Close 

gute Werke in anhängt, aber wie kann ich schreibe es utf-8 codiert?

Die zweite:

Dim ST As ADODB.Stream 

Set ST = New ADODB.Stream 
ST.Mode = adModeReadWrite 
ST.Type = adTypeText 
ST.Charset = "UTF-8" 

ST.Open 
ST.LoadFromFile FileIn(fi) 
ST.Position = ST.Size 
ST.WriteText "<tag>kkkjòòkkkkjlòlk</tag>" 
ST.SaveToFile FileIn(fi) 
ST.Close 

schreiben korrekt in utf-8, aber ich die Datei nicht schreiben kann, sondern nur mit "adSaveCreateOverWrite" in anhängt.

Wie kann ich das tun? Gibt es eine andere Art und Weise?

Vielen Dank.

+1

Ihre ADODB Stream-Objekt verwenden, wenn die Datei, die Sie anhängen nicht zu groß ist, dass Sie es öffnen kann, lesen Sie den vorhandenen Text in eine Variable, dann schreibe die Variable und den neuen Text zurück. Sie können auch jedes Mal eine neue Datei öffnen, indem Sie den vorhandenen Text und anschließend den neuen Text schreiben. Töte die aktuelle Datei und benenne die neue Datei um. Kompliziert, funktioniert aber schnell genug für kleinere Dateien, auf die der Benutzer nicht warten muss. – jac

+0

Leider arbeite ich mit großer Textdatei. Ich denke, dass es öffnen und den vorhandenen Text zu jeder Schleife lesen wird eine schwere Arbeit für meine Anwendung sein. – epi82

Antwort

7

könnten Sie kombinieren binäre I/O mit einem API-Aufruf die Umstellung auf UTF-8 auszuführen:

Option Explicit 

Private Const CP_UTF8 As Long = 65001 

Private Declare Function WideCharToMultiByte Lib "kernel32" (_ 
    ByVal CodePage As Long, _ 
    ByVal dwFlags As Long, _ 
    ByVal lpWideCharStr As Long, _ 
    ByVal cchWideChar As Long, _ 
    ByVal lpMultiByteStr As Long, _ 
    ByVal cchMultiByte As Long, _ 
    ByVal lpDefaultChar As Long, _ 
    ByVal lpUsedDefaultChar As Long) As Long 

Private Function OpenAppendUTF8(ByVal FileName As String) As Integer 
    OpenAppendUTF8 = FreeFile(0) 
    Open FileName For Binary Access Write As #OpenAppendUTF8 
    Seek #OpenAppendUTF8, LOF(OpenAppendUTF8) + 1 
End Function 

Private Sub WriteUTF8(_ 
    ByVal FNum As Integer, _ 
    ByVal Text As String, _ 
    Optional ByVal NL As Boolean) 

    Dim lngResult As Long 
    Dim UTF8() As Byte 

    If NL Then Text = Text & vbNewLine 
    lngResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(Text), Len(Text), _ 
            0, 0, 0, 0) 
    If lngResult > 0 Then 
     ReDim UTF8(lngResult - 1) 
     WideCharToMultiByte CP_UTF8, 0, StrPtr(Text), Len(Text), _ 
          VarPtr(UTF8(0)), lngResult, 0, 0 
     Put #FNum, , UTF8 
    End If 
End Sub 

Private Sub Main() 
    Dim F As Integer 

    F = OpenAppendUTF8("test.txt") 
    WriteUTF8 F, "Hello" 
    WriteUTF8 F, ChrW$(&H2026&) 
    WriteUTF8 F, "World", True 
    Close #F 
    MsgBox "Done" 
End Sub 
+1

Fügen Sie einfach UTF-8 BOM hinzu, wenn 'LOF (OpenAppendUTF8)' null ist. – wqw

+0

Eigentlich sollten UTF-8-Dateien niemals eine Stückliste * haben, obwohl Sie sie häufig in Windows-Dateien sehen. http://en.wikipedia.org/wiki/UTF-8#Byte_order_mark Also ja, wenn Sie eine solche Stückliste benötigen, fügen Sie eine wie vorgeschlagen hinzu. Beachten Sie außerdem, dass UTF-8-Dateien häufig LF-Zeichen anstelle von CRLF-Zeilentrennzeichen enthalten, eine weitere Optimierung könnte vorgenommen werden. – Bob77

0

Ich ziehe es ANSI zu speichern, wie es standardmäßig der Fall ist. Öffne es mit einem Notizblock und überschreibe es mit UTF8-Kodierung. Ich fand es bei weitem der schnellste Weg. Und ich einen anderen Code zu verwenden, für eine Datenbank convertion zum Beispiel anfügen:

Dim fs As Object, a 
Set fs = CreateObject("Scripting.FileSystemObject") 
Set a = fs.CreateTextFile(filename, True) 'example (myfile.xml, True) 
a.writeline var1 
a.writeline var2 
a.Close 
+0

Funktioniert das? Ich dachte, wenn du es zuerst mit ANSI schreibst, beschränkst du deinen Zeichensatz. Würde es nicht in UTF8 speichern, nachdem es ANSI ist, nur in einer UTF-Version des ANSI-Zeichensatzes resultiert? Wenn dein Text also in russischer Sprache geschrieben wäre, würdest du wirklich die richtigen Buchstaben beibehalten? Die CreateTextFile kann als Unicode (UTF16) speichern, indem Sie ein anderes "True" hinzufügen, dann könnten Sie es wahrscheinlich in Wordpad oder etwas in UTF8 konvertieren, ohne viel zu verlieren. – JeffG

Verwandte Themen