技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

VB保存UTF-8编码的text文件【亲测可用】

作者:admin    时间:2022-4-1 7:6:31    浏览:

今天用VB生成XML文件,生成后再用VB打开时提示有不可用的字符,由于此程序已经测试过打开XML文件是没有问题的,我再仔细检查一下生成的XML文件,并没发现有非法字符或格式错误的问题,于是我就想到可能是编码的问题。

VB保存UTF-8编码的text文件 

检查文件是什么编码

检查方法很简单,用文本方式打开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
    • 站长推荐
    /* 左侧显示文章内容目录 */