保存使用VBA编码的UTF-8文本文件

Kar*_* W. 45 vba utf-8

如何将UTF-8编码的字符串写入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
Run Code Online (Sandbox Code Playgroud)

应用程序级别是否有一些设置?

Kar*_* W. 71

我在网上找到了答案:

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
Run Code Online (Sandbox Code Playgroud)

当然不像我预期的那样......

  • 我不知道,你试过吗? (22认同)

Máť*_*.cz 16

您可以使用CreateTextFile或OpenTextFile方法,两者都具有对编码设置有用的属性"unicode".

object.CreateTextFile(filename[, overwrite[, unicode]])        
object.OpenTextFile(filename[, iomode[, create[, format]]])
Run Code Online (Sandbox Code Playgroud)

示例:覆盖:

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

示例:附加:

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

有关MSDN文档的更多信息,请参阅

  • `A/CreateTextFile:文件名= "文件名" FSO设置=的CreateObject( "Scripting.FileSystemObject的")列明= fso.CreateTextFile(文件名,真,真)out.WriteLine( "你好!世界")... out.close b /的OpenTextFile设置FSO =的CreateObject( "Scripting.FileSystemObject的")列明= fso.OpenTextFile( "文件名",ForAppending,真实,-1)out.Write "世界,你好!" ......出来.关闭 (2认同)
  • 尝试了几种设置后,当我使用: fso.CreateTextFile(fileName, True, True) 时,格式为 UTF-16 LE,当我将代码更改为 ; fso.CreateTextFile(fileName, True, False) 格式为 UTF-8 (2认同)

Phi*_*bbs 8

这会在文件的开头写一个字节顺序标记,这在UTF-8文件中是不必要的,而某些应用程序(在我的情况下,SAP)不喜欢它.解决方案:我可以没有BOM的情况下使用UTF-8导出Excel数据吗?


小智 6

这是另一种方法 - 使用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
Run Code Online (Sandbox Code Playgroud)