Search code examples
utf-8vb6appendtext-files

Write text file in appending (utf-8 encoded) in VB6


I have to write a textfile in VB6. I need to do it in appending and utf-8 encoded.

I tried two solutions, one with "TextStream" and another one with "ADODB.Stream".

The first one:

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

Works good in appending but how can I write it utf-8 encoded?

The second one:

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

Write correctly in utf-8 but I can't write the file in appending but only with "adSaveCreateOverWrite".

How can I do that? Is there another way?

Thank you very much.


Solution

  • You could combine binary I/O with an API call to perform the conversion to 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