2012-05-04 210 views
8

Tengo que escribir un archivo de texto en VB6. Necesito hacerlo añadiendo y codificado para utf-8.Escribir archivo de texto en anexar (codificación utf-8) en VB6

Intenté dos soluciones, una con "TextStream" y otra con "ADODB.Stream".

La primera de ellas:

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

funciona bien en añadiendo pero ¿cómo puedo escribirlo codificación UTF-8?

La segunda:

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 

escribir correctamente en UTF-8, pero no puedo escribir en el archivo añadiendo pero sólo con "adSaveCreateOverWrite".

¿Cómo puedo hacer eso? ¿Hay otra manera?

Muchas gracias.

+1

Usando el objeto Stream ADODB, si el archivo está anexando a no es demasiado grande se puede abrir, leer el texto existente en una variable, luego escriba la variable y vuelva a salir el nuevo texto. También puede abrir un archivo nuevo cada vez, escribirle el texto existente y luego el texto nuevo. Mata el archivo actual y cambia el nombre del nuevo archivo. Complicado, pero funciona lo suficientemente rápido para archivos más pequeños que el usuario no deja esperando. – jac

+0

Lamentablemente estoy trabajando con archivos de texto de gran tamaño. Creo que abrirlo y leer el texto existente en cada ciclo será un trabajo pesado para mi aplicación. – epi82

Respuesta

7

Se puede combinar binaria de E/S con una llamada a la API para realizar la conversión a 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

Simplemente agregue BOM UTF-8 si 'LOF (OpenAppendUTF8)' es cero. – wqw

+0

En realidad, se supone que los archivos UTF-8 * no tienen * una BOM, aunque con frecuencia los verá en los archivos de Windows. http://en.wikipedia.org/wiki/UTF-8#Byte_order_mark Así que sí, si necesita ese BOM, agregue uno como se sugiere. También tenga en cuenta que a menudo se espera que los archivos UTF-8 tengan LF en lugar de delimitadores de línea CRLF, una modificación más que uno podría hacer. – Bob77

0

prefiero guardarlo ANSI como lo hace por defecto. Ábralo con un bloc de notas y sobrescríbalo seleccionando la codificación UTF8. Descubrí que es la forma más rápida de lejos. Y utilizo algún otro código para añadir, por ejemplo para una conversión de base de datos:

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

¿Eso funciona? Pensé que si lo escribes primero con ANSI, estás limitando tu juego de caracteres. ¿No sería guardarlo en UTF8 después de que sea ANSI solo el resultado en una versión UTF del juego de caracteres ANSI? Entonces, si su texto estuviera en ruso, ¿realmente mantendría los caracteres adecuados? CreateTextFile puede guardar como Unicode (UTF16) agregando otro "Verdadero", entonces probablemente podrías convertirlo en Wordpad o algo similar a UTF8 sin perder mucho. – JeffG

Cuestiones relacionadas