2012-05-04 306 views
8

我必須在VB6中編寫一個文本文件。我需要在追加和utf-8編碼中做到這一點。在VB6中寫入附加文本文件(utf-8編碼)

我嘗試了兩種解決方案,一種是「TextStream」,另一種是「ADODB.Stream」。

第一招:

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

作品中追加不錯,但我怎麼能寫UTF-8編碼?

第二個:

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 

寫正確UTF-8,但我不能寫在追加而只用「adSaveCreateOverWrite」的文件。

我該怎麼做?有另一種方法嗎?

非常感謝。

+1

使用您的ADODB流對象,如果要附加到文件不是太大,你可以打開它,閱讀現有文本一個變量,然後寫入變量,並返回新的文本。您也可以每次打開一個新文件,將現有文本寫入它,然後寫入新文本。殺死當前文件,並重命名新文件。複雜,但足夠快,足夠小的文件,用戶不會等待。 – jac

+0

不幸的是我正在處理大型文本文件。我認爲打開它並閱讀每個循環的現有文本對我的應用程序來說將是一項沉重的工作。 – epi82

回答

7

你可以二進制I/O與API調用結合來執行轉換爲UTF-8:

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

如果'LOF(OpenAppendUTF8)'爲零,只需添加UTF-8 BOM。 – wqw

+0

實際上,UTF-8文件絕對不應該*有* BOM,儘管您會經常在Windows文件中看到它們。 http://en.wikipedia.org/wiki/UTF-8#Byte_order_mark所以是的,如果你需要這樣的BOM添加一個建議。另外請注意,UTF-8文件通常需要使用LF而不是CRLF行分隔符,這樣可以進一步調整。 – Bob77

0

我寧願因爲它在默認情況下將其保存ANSI。用記事本打開並覆蓋它,選擇UTF8編碼。我發現這是迄今爲止最快的方法。 我使用一些其他的代碼來追加,例如用於數據庫皈依:

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

這是否工作?我認爲如果你先用ANSI編寫它,那麼你就限制了你的字符集。在ANSI之後不會將它保存在UTF8中只會導致ANSI字符集的UTF版本?所以如果你的文字是俄文的,你真的會保持正確的字符嗎? CreateTextFile可以通過添加另一個「True」來保存爲Unicode(UTF16),然後您可以將其轉換爲寫字板或其他東西到UTF8而不會丟失太多。 – JeffG