VB保存UTF-8编码的text文件【亲测可用】
作者:admin 时间:2022-4-1 7:6:31 浏览:今天用VB生成XML文件,生成后再用VB打开时提示有不可用的字符,由于此程序已经测试过打开XML文件是没有问题的,我再仔细检查一下生成的XML文件,并没发现有非法字符或格式错误的问题,于是我就想到可能是编码的问题。
检查文件是什么编码
检查方法很简单,用文本方式打开XML文件,然后“另存为...”,看到显示什么编码,文件就是什么编码。
经检查,生成的XML文件是ANSI编码。
而程序能成功打开的XML文件是UTF-8编码。
所以,我要实现VB生成UTF-8编码的XML文件。
实现代码
网上找了一会,终于找到了亲测有效的代码。
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
代码比较复杂,没有一定VBA基础是难以读懂理解的,大概是通过二进制访问字符串字节并转换成UTF-8的编码格式。
总结
现在很少人用VB编写应用程序了,工作效率太低,如本文的例子,用C#或VB.NET,几行代码就搞定了,因为很多函数都封装好了,功能齐全,用它们来编写应用程序,效率高很多。
不过用VB编写的应用程序,由于用的都是底层的东西,拿到另一平台运行,不需要安装什么框架,很方便,我觉得这是它的一大优点。
标签: VB
相关文章
x
- 站长推荐