2010-03-26 51 views
38

¿Cómo puedo escribir cadenas UTF-8 codificados a un archivo de texto desde VBA, comoGuardar archivo de texto UTF-8 codificado con VBA

Dim fnum As Integer 
fnum = FreeFile 
Open "myfile.txt" For Output As fnum 
Print #fnum, "special characters: äöüß" 'latin-1 or something by default 
Close fnum 

¿Hay un cierto ajuste en el nivel de aplicación?

Respuesta

61

he encontrado la respuesta en el web:

Dim fsT As Object 
Set fsT = CreateObject("ADODB.Stream") 
fsT.Type = 2 'Specify stream type - we want To save text/string data. 
fsT.Charset = "utf-8" 'Specify charset For the source text data. 
fsT.Open 'Open the stream And write binary data To the object 
fsT.WriteText "special characters: äöüß" 
fsT.SaveToFile sFileName, 2 'Save binary data To disk 

Ciertamente no lo que yo esperaba ...

+0

hola, ¿y si quería ahorrar en utf-16, solo tengo que cambiar de 8 a 16, verdad? – Smith

+16

no sé, ¿lo intentaste? –

+1

No funciona en una Mac –

12

Puede usar el método CreateTextFile o OpenTextFile, ambos tienen un atributo "unicode" útil para la configuración de codificación.

object.CreateTextFile(filename[, overwrite[, unicode]])   
object.OpenTextFile(filename[, iomode[, create[, format]]]) 

Ejemplo: sobrescribir:

CreateTextFile: 
fileName = "filename" 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set out = fso.CreateTextFile(fileName, True, True) 
out.WriteLine ("Hello world!") 
... 
out.close 

Ejemplo: append:

OpenTextFile Set fso = CreateObject("Scripting.FileSystemObject") 
Set out = fso.OpenTextFile("filename", ForAppending, True, 1) 
out.Write "Hello world!" 
... 
out.Close 

Ver más en MSDN docs

+0

Interesante. Object es de clase 'FileSystemObject', ¿verdad? ¿Cómo escribiría en este archivo? '.Write'? –

+1

'A/CreateTextFile: archivo = "nombre de archivo" Set FSO = CreateObject ("Scripting.FileSystemObject") Se presenta a = fso.CreateTextFile (nombre del archivo, True, True) out.WriteLine ("Hola mundo!") ... out.close b/OpenTextFile Establecer FSO = CreateObject ("Scripting.FileSystemObject") establecidos = fso.OpenTextFile ("nombre de archivo", ForAppending, True, -1) out.Write " ¡Hola Mundo!" ... out.Close' –

+15

Unicode! = UTF-8 – Helen

5

Aquí hay otra manera de hacerlo - mediante el WideCharToMultiByte función de la API :

Option Explicit 

Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (_ 
    ByVal CodePage As Long, _ 
    ByVal dwFlags As Long, _ 
    ByVal lpWideCharStr As Long, _ 
    ByVal cchWideChar As Long, _ 
    ByVal lpMultiByteStr As Long, _ 
    ByVal cbMultiByte As Long, _ 
    ByVal lpDefaultChar As Long, _ 
    ByVal lpUsedDefaultChar As Long) As Long 

Private Sub getUtf8(ByRef s As String, ByRef b() As Byte) 
Const CP_UTF8 As Long = 65001 
Dim len_s As Long 
Dim ptr_s As Long 
Dim size As Long 
    Erase b 
    len_s = Len(s) 
    If len_s = 0 Then _ 
    Err.Raise 30030, , "Len(WideChars) = 0" 
    ptr_s = StrPtr(s) 
    size = WideCharToMultiByte(CP_UTF8, 0, ptr_s, len_s, 0, 0, 0, 0) 
    If size = 0 Then _ 
    Err.Raise 30030, , "WideCharToMultiByte() = 0" 
    ReDim b(0 To size - 1) 
    If WideCharToMultiByte(CP_UTF8, 0, ptr_s, len_s, VarPtr(b(0)), size, 0, 0) = 0 Then _ 
    Err.Raise 30030, , "WideCharToMultiByte(" & Format$(size) & ") = 0" 
End Sub 

Public Sub writeUtf() 
Dim file As Integer 
Dim s As String 
Dim b() As Byte 
    s = "äöüßµ@€|~{}[]²³\ .." & _ 
    " OMEGA" & ChrW$(937) & ", SIGMA" & ChrW$(931) & _ 
    ", alpha" & ChrW$(945) & ", beta" & ChrW$(946) & ", pi" & ChrW$(960) & vbCrLf 
    file = FreeFile 
    Open "C:\Temp\TestUtf8.txt" For Binary Access Write Lock Read Write As #file 
    getUtf8 s, b 
    Put #file, , b 
    Close #file 
End Sub 
1

Miré la respuesta de Máťa, cuyo nombre insinúa la codificación de las calificaciones y la experiencia. El VBA docs dice CreateTextFile(filename, [overwrite [, unicode]]) crea un archivo "como un archivo Unicode o ASCII. El valor es True si el archivo se crea como un archivo Unicode; Falso si se crea como un archivo ASCII. Si se omite, se asume un archivo ASCII". Está bien que un archivo almacene caracteres Unicode, ¿pero en qué codificación? Unicode no codificado no se puede representar en un archivo.

El VBA doc page de OpenTextFile(filename[, iomode[, create[, format]]]) ofrece una tercera opción para el formato:

  • TriStateDefault 2 "abre el archivo usando el sistema por defecto."
  • TriStateTrue 1 "abre el archivo como Unicode."
  • TriStateFalse 0 "abre el archivo como ASCII."

Máťa pasa -1 para este argumento.

Juicio de VB.NET documentation (no VBA pero creo que refleja realidades acerca de cómo subyace el sistema operativo Windows representa cadenas Unicode y se repite en MS Office, no sé) el sistema predeterminado es una codificación usando 1 byte/carácter unicode usando un Página de códigos ANSI para la configuración regional. UnicodeEncoding es UTF-16. Los documentos también describen que UTF-8 también es una "codificación Unicode", lo cual tiene sentido para mí. Pero todavía no sé cómo especificar UTF-8 para la salida de VBA ni estoy seguro de que los datos que escribo en el disco con OpenTextFile (,,, 1) están codificados en UTF-16. Tamalek's post es útil.

Cuestiones relacionadas