2010-03-26 60 views
38

làm thế nào tôi có thể viết UTF-8 chuỗi mã hóa cho một textfile từ VBA, nhưLưu file văn bản UTF-8 mã hóa với 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 

Có một số thiết lập về mức độ ứng dụng?

Trả lời

61

Tôi tìm thấy câu trả lời trên 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 

Chắc chắn không phải như tôi mong đợi ...

+0

Xin chào, nếu tôi muốn lưu trong utf-16, tôi chỉ phải thay đổi từ 8 đến 16 phải không? – Smith

+16

tôi không biết, bạn đã thử chưa? –

+1

Không hoạt động trên một máy Mac –

6

này viết một Byte Order Mark vào lúc bắt đầu của tập tin, đó là không cần thiết trong một UTF -8 tập tin và một số ứng dụng (trong trường hợp của tôi, SAP) không thích nó. Giải pháp tại đây: Can I export excel data with UTF-8 without BOM?

12

Bạn có thể sử dụng phương thức CreateTextFile hoặc OpenTextFile, cả hai đều có thuộc tính "unicode" hữu ích cho cài đặt mã hóa.

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

Ví dụ: Ghi đè:

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

Ví dụ: Nối:

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

Xem thêm về MSDN docs

+0

Thú vị. Object là lớp 'FileSystemObject', phải không? Tôi sẽ ghi vào tập tin này bằng cách nào? '.Write'? –

+1

'a/CreateTextFile: fileName = "filename" Set FSO = CreateObject ("Scripting.FileSystemObject") Đặt ra = fso.CreateTextFile (fileName, True, True) out.WriteLine ("Hello world!") ... out.close b/OpenTextFile Set FSO = CreateObject ("Scripting.FileSystemObject") Đặt ra = fso.OpenTextFile ("filename", ForAppending, True, -1) out.Write " Chào thế giới!" ... out.Close' –

+15

Unicode! = UTF-8 – Helen

5

Đây là một cách khác để làm điều này - bằng cách sử dụng chức năng API WideCharToMultiByte :

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

Tôi đã xem xét câu trả lời từ Máťa có tên gợi ý về trình độ và kinh nghiệm mã hóa. VBA docs nói CreateTextFile(filename, [overwrite [, unicode]]) tạo một tệp "dưới dạng tệp Unicode hoặc ASCII. Giá trị là True nếu tệp được tạo dưới dạng tệp Unicode; Sai nếu tệp được tạo dưới dạng tệp ASCII. Nếu bỏ qua, tệp ASCII được giả định". Nó là tốt mà một tập tin lưu trữ các ký tự unicode, nhưng trong những gì mã hóa? Unicode unencoded không thể được biểu diễn trong một tập tin.

Các VBA doc page cho OpenTextFile(filename[, iomode[, create[, format]]]) cung cấp một lựa chọn thứ ba cho các định dạng:

  • TriStateDefault 2 "mở tập tin bằng cách sử dụng mặc định của hệ thống."
  • TriStateTrue 1 "mở tệp dưới dạng Unicode".
  • TriStateFalse 0 "mở tệp dưới dạng ASCII."

Máťa vượt -1 cho đối số này.

Đánh giá từ VB.NET documentation (không phải VBA nhưng tôi nghĩ phản ánh thực tế về cách hệ điều hành Windows cơ bản biểu thị chuỗi unicode và lặp lại thành MS Office, tôi không biết) mặc định hệ thống là mã hóa sử dụng ký tự 1 byte/unicode Trang mã ANSI cho ngôn ngữ. UnicodeEncoding là UTF-16. Các tài liệu cũng mô tả UTF-8 cũng là một "mã hóa Unicode", có ý nghĩa với tôi. Nhưng tôi chưa biết làm thế nào để chỉ định UTF-8 cho đầu ra VBA cũng không tự tin rằng dữ liệu tôi ghi vào đĩa với OpenTextFile (,,, 1) được mã hoá UTF-16. Tamalek's post hữu ích.

Các vấn đề liên quan