2012-05-04 13 views
8

Devo scrivere un file di testo in VB6. Ho bisogno di farlo in accodamento e codificato in utf-8.Scrivi file di testo in allegato (codifica UTF-8) in VB6

Ho provato due soluzioni, una con "TextStream" e un'altra con "ADODB.Stream".

Il primo:

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

Lavora bene in aggiungendo, ma come posso scriverlo codifica UTF-8?

Il secondo:

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 

scrivere correttamente in UTF-8, ma non posso scrivere il file in aggiungendo, ma solo con "adSaveCreateOverWrite".

Come posso farlo? C'è un altro modo?

Grazie mille.

+1

Utilizzando l'oggetto ADODB Stream, se il file che si desidera aggiungere i di non è troppo grande è possibile aprirlo, leggere il testo esistente in una variabile, quindi scrivere la variabile e il nuovo testo fuori. Puoi anche aprire un nuovo file ogni volta, scrivere il testo esistente, quindi il nuovo testo. Elimina il file corrente e rinomina il nuovo file. Complicato, ma funziona abbastanza velocemente per i file più piccoli che l'utente non è lasciato in attesa. – jac

+0

Purtroppo sto lavorando con file di testo di grandi dimensioni. Penso che aprirlo e leggere il testo esistente in ogni ciclo sia un lavoro pesante per la mia applicazione. – epi82

risposta

7

È possibile combinare binari I/O con una chiamata API per eseguire la conversione in 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

Basta aggiungere UTOM-8 BOM se 'LOF (OpenAppendUTF8)' è zero. – wqw

+0

In realtà i file UTF-8 non dovrebbero mai * avere * una distinta base, anche se li vedrete spesso su file Windows. http://en.wikipedia.org/wiki/UTF-8#Byte_order_mark Quindi sì, se hai bisogno di un tale BOM aggiungilo come suggerito. Si noti inoltre che i file UTF-8 sono spesso in presenza di delimitatori di riga LF anziché CRLF, un altro tweak che si potrebbe fare. – Bob77

0

preferisco salvarlo ANSI come fa per impostazione predefinita. Aprilo con un blocco note e sovrascrivilo selezionando la codifica UTF8. Ho trovato che è il modo più veloce di gran lunga. E io uso un altro codice per aggiungere, ad esempio per una conversione di database:

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

Funziona? Ho pensato che se lo scrivi prima con ANSI, stai limitando il tuo set di caratteri. Non lo salverebbe in UTF8 dopo che l'ANSI ha appena prodotto una versione UTF del set di caratteri ANSI? Quindi se il tuo testo fosse in russo, manteresti davvero i caratteri corretti? CreateTextFile può salvare come Unicode (UTF16) aggiungendo un altro "Vero", quindi potresti probabilmente convertirlo in Wordpad o qualcosa in UTF8 senza perdere molto. – JeffG