Вопрос по – Записать текстовый файл в приложении (в кодировке utf-8) в VB6

8

Я должен написать текстовый файл в VB6. Мне нужно сделать это в дополнении и в кодировке utf-8.

Я пробовал два решения, одно с & quot; TextStream & quot; и еще один с «ADODB.Stream».

Первый:

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

Хорошо работает при добавлении, но как я могу написать это в кодировке utf-8?

Второй:

<code>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
</code>

Пишите правильно в utf-8, но я не могу написать файл в добавлении, но только с помощью "adSaveCreateOverWrite".

Как я могу это сделать? Есть ли другой способ?

Большое спасибо.

К сожалению, я работаю с большим текстовым файлом. Я думаю, что открыть его и прочитать существующий текст для каждого цикла будет тяжелой работой для моего приложения. epi82
Используя ваш объект ADODB Stream, если файл, к которому вы добавляете, не слишком велик, вы можете открыть его, прочитать существующий текст в переменную, затем записать переменную и вывести новый текст обратно. Вы также можете каждый раз открывать новый файл, записывать в него существующий текст, а затем новый текст. Убейте текущий файл и переименуйте новый файл. Сложно, но работает достаточно быстро для небольших файлов, которые пользователь не ждет. jac

Ваш Ответ

2   ответа
10

преобразования в 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
На самом деле файлы UTF-8 никогда не должныhave спецификацию, хотя вы часто будете видеть их в файлах Windows.en.wikipedia.org/wiki/UTF-8#Byte_order_mark Так что да, если вам нужна такая спецификация, добавьте ее в соответствии с предложением. Также обратите внимание, что в файлах UTF-8 часто ожидается наличие LF вместо разделителей строк CRLF, что может сделать еще один твик.
Просто добавьте UTF-8 BOM, еслиLOF(OpenAppendUTF8) это ноль.
1

как это делается по умолчанию. Откройте его блокнотом и перезапишите, выбрав кодировку 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
Это работает? Я подумал, что если вы сначала напишите это с помощью ANSI, то вы ограничите свой набор символов. Не приведет ли это к сохранению в UTF8 после того, как ANSI просто приведет к UTF-версии набора символов ANSI? Итак, если бы ваш текст был на русском языке, вы бы действительно сохранили правильные символы? CreateTextFile можно сохранить как Unicode (UTF16), добавив еще один «True», тогда вы, вероятно, сможете конвертировать его в Wordpad или что-то в UTF8, не пропуская много.

Похожие вопросы