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

保存用VBA编码的文本文件UTF-8,vba,utf-8,Vba,Utf 8,如何从vba将UTF-8编码字符串写入文本文件,如 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 在应用程序级别是否有一些设置?我在以下页面上找到了答案: 当然不是我所期望的…这会在文件的开头写一个字节顺序标记,这在UTF-8文件

如何从vba将UTF-8编码字符串写入文本文件,如

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
在应用程序级别是否有一些设置?

我在以下页面上找到了答案:


当然不是我所期望的…

这会在文件的开头写一个字节顺序标记,这在UTF-8文件中是不必要的,而且一些应用程序(在我的例子中,SAP)不喜欢它。
这里的解决方案:

您可以使用CreateTextFile或OpenTextFile方法,这两种方法都有一个用于编码设置的属性“unicode”

object.CreateTextFile(filename[, overwrite[, unicode]])        
object.OpenTextFile(filename[, iomode[, create[, format]]])
示例:覆盖:

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

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

有关详细信息,请参见下面的另一种方法-使用API函数WideChartMultiByte:

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

我研究了马萨的答案,他的名字暗示着编码资格和经验。say
CreateTextFile(filename,[overwrite[,unicode]])
将文件“创建为unicode或ASCII文件。如果文件创建为unicode文件,则该值为True;如果文件创建为ASCII文件,则该值为False。如果省略,则假定为ASCII文件。“文件存储unicode字符很好,但编码是什么?”?无法在文件中表示未编码的unicode

for
OpenTextFile(filename[,iomode[,create[,format]]])
为格式提供了第三个选项:

  • TriStateDefault 2“使用系统默认值打开文件。”
  • TriStateTrue 1“以Unicode格式打开文件。”
  • TriStateFalse 0“以ASCII格式打开文件。”
Máťa对此论点通过-1


从(不是VBA,但我认为它反映了底层Windows操作系统如何表示unicode字符串并在MS Office中回响的现实情况,我不知道)判断,系统默认是使用1字节/unicode字符进行编码,使用ANSI代码页进行区域设置<代码>Unicode编码是UTF-16。文档还描述了UTF-8也是一种“Unicode编码”,这对我来说很有意义。但我还不知道如何为VBA输出指定UTF-8,也不知道我用OpenTextFile(,,1)写入磁盘的数据是否是UTF-16编码的。非常有用。

将字符串转换为UTF-8字符串的传统方法如下:

StrConv("hello world",vbFromUnicode)
简而言之:

Dim fnum As Integer
fnum = FreeFile
Open "myfile.txt" For Output As fnum
Print #fnum, StrConv("special characters: äöüß", vbFromUnicode)
Close fnum

不需要特殊的COM对象

您好,如果我想在utf-16中保存,我只需要将8更改为16,对吗?我不知道,您尝试过吗?尝试过您的代码。保存文件的内容:特殊字符:÷ÃÃüŸ有趣。对象属于类
FileSystemObject
,对吗?如何写入此文件
.Write
a/CreateTextFile:fileName=“fileName”Set fso=CreateObject(“Scripting.FileSystemObject”)Set out=fso.CreateTextFile(fileName,True,True)out.WriteLine(“Hello world!”)。。。out.close b/OpenTextFile Set fso=CreateObject(“Scripting.FileSystemObject”)Set=fso.OpenTextFile(“filename”,用于外观,True,-1)out。写“Hello world!”。。。out.Close
如果要使用MAC和Windows,请搜索或其他库。尝试了几个设置后,当我使用:fso.CreateTextFile(fileName,True,True)时,当我将代码更改为时,格式为UTF-16 LE;CreateTextFile(文件名,True,False)格式为UTF-8
Dim fnum As Integer
fnum = FreeFile
Open "myfile.txt" For Output As fnum
Print #fnum, StrConv("special characters: äöüß", vbFromUnicode)
Close fnum