2012-05-04 25 views
8

Muszę napisać plik tekstowy w VB6. Muszę to zrobić w dołączeniu i zakodować utf-8.Napisz plik tekstowy w dołączaniu (kodowany utf-8) w VB6

Próbowałem dwa rozwiązania, jeden z "TextStream" i inny z "ADODB.Stream".

Pierwszy:

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

działa dobrze w dołączanie ale jak mogę napisać to kodowanie UTF-8?

drugi:

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 

poprawnie pisać w UTF-8, ale nie mogę napisać plik w dołączanie ale tylko z „adSaveCreateOverWrite”.

Jak mogę to zrobić? Czy istnieje inny sposób?

Dziękuję bardzo.

+1

pośrednictwem swojego obiektu ADODB Stream, jeśli plik jesteś dołączanie do nie jest zbyt duży, można go otworzyć, przeczytać istniejący tekst do zmienna, następnie zapisz zmienną, a nowy tekst wycofaj. Za każdym razem możesz otworzyć nowy plik, zapisać istniejący tekst, a następnie nowy tekst. Zabij bieżący plik i zmień nazwę nowego pliku. Skomplikowane, ale działa wystarczająco szybko dla mniejszych plików, na które użytkownik nie czeka. – jac

+0

Niestety pracuję z dużym plikiem tekstowym. Myślę, że otwarcie i przeczytanie istniejącego tekstu do każdej pętli będzie ciężką pracą dla mojej aplikacji. – epi82

Odpowiedz

7

Można połączyć binarne wejście/wyjście z wywołania API do wykonywania konwersji na 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

Po prostu dodaj zestawienie pozycji UTF-8, jeśli "LOF (OpenAppendUTF8)" wynosi zero. – wqw

+0

W rzeczywistości pliki UTF-8 nigdy nie powinny * mieć * BOM-a, ale często będziesz je widział w plikach Windows. http://en.wikipedia.org/wiki/UTF-8#Byte_order_mark Tak, jeśli potrzebujesz takiej LM, dodaj jedną zgodnie z sugestią. Zwróć też uwagę, że często oczekuje się, że pliki UTF-8 mają LF zamiast ograniczników linii CRLF, jeszcze jedna modyfikacja może być wykonana. – Bob77

0

Wolę go zapisać ANSI jak ma to domyślnie. Otwórz go za pomocą notatnika i zastąp go, wybierając kodowanie UTF8. Znalazłem najszybszy sposób. i używam innego kodu do dołączania, na przykład za pomocą przeliczaniem bazy danych:

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

Czy to działa? Pomyślałem, że jeśli napiszesz najpierw z ANSI, to ograniczasz swój zestaw znaków. Czy zapisanie go w UTF8 po ANSI nie spowodowałoby po prostu wersji UTF zestawu znaków ANSI? Więc jeśli twój tekst był po rosyjsku, czy naprawdę zachowałbyś właściwe znaki? Plik CreateTextFile można zapisać jako Unicode (UTF16), dodając kolejny "True", a następnie możesz go przekonwertować w Wordpadzie lub coś w UTF8, nie tracąc zbyt wiele. – JeffG