Access VBA 使用API 读写 UTF-8 文本文件的内容
- 2017-07-26 17:42:00
- zstmtony 转贴
- 4129
Access VBA 使用API 读写 UTF-8 文本文件的内容
这是一个转换UTF-8格式文本文件的示例,包括读取和写入,需要用到两个API函数:MultiByteToWideChar和WideCharToMultiByte Public Declare Function MultiByteToWideChar Lib "kernel32" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByRef lpMultiByteStr As Any, _ ByVal cchMultiByte As Long, _ ByVal lpWideCharStr As Long, _ ByVal cchWideChar As Long) As Long Public Declare Function WideCharToMultiByte Lib "kernel32" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ ByVal lpWideCharStr As Long, _ ByVal cchWideChar As Long, _ ByRef lpMultiByteStr As Any, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As String, _ ByVal lpUsedDefaultChar As Long) As Long Public Const CP_UTF8 = 65001 ' 将输入文本写进UTF8格式的文本文件 ' 输入 ' strInput:文本字符串 ' strFile:保存的UTF8格式文件路径 ' bBOM:True表示文件带"EFBBBF"头,False表示不带 Sub WriteUTF8File(strInput As String, strFile As String, Optional bBOM As Boolean = True) Dim bByte As Byte Dim ReturnByte() As Byte Dim lngBufferSize As Long Dim lngResult As Long Dim TLen As Long ' 判断输入字符串是否为空 If Len(strInput) = 0 Then Exit Sub On Error GoTo errHandle ' 判断文件是否存在,如存在则删除 If Dir(strFile) <> "" Then Kill strFile TLen = Len(strInput) lngBufferSize = TLen * 3 + 1 ReDim ReturnByte(lngBufferSize - 1) lngResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(strInput), TLen, _ ReturnByte(0), lngBufferSize, vbNullString, 0) If lngResult Then lngResult = lngResult - 1 ReDim Preserve ReturnByte(lngResult) Open strFile For Binary As #1 If bBOM = True Then bByte = 239 Put #1, , bByte bByte = 187 Put #1, , bByte bByte = 191 Put #1, , bByte End If Put #1, , ReturnByte Close #1 End If Exit Sub errHandle: MsgBox Err.Description, , "错误 - " & Err.Number End Sub ' 读取UTF8文件并转换为VBA中可读的字符串 ' 输入 ' strFile:UTF8格式文件的路径 Function readUTF8File(strFile As String) As String Dim bByte As Byte Dim ReturnByte() As Byte Dim lngBufferSize As Long Dim strBuffer As String Dim lngResult As Long Dim bHeader(1 To 3) As Byte Dim i As Long On Error GoTo errHandle If Dir(strFile) = "" Then Exit Function ' 以二进制打开文件 Open strFile For Binary As #1 ReDim ReturnByte(0 To LOF(1) - 1) As Byte ' 读取前三个字节 Get #1, , bHeader(1) Get #1, , bHeader(2) Get #1, , bHeader(3) ' 判断前三个字节是否为BOM头 If bHeader(1) = 239 And bHeader(2) = 187 And bHeader(3) = 191 Then For i = 3 To LOF(1) - 1 Get #1, , ReturnByte(i - 3) Next i Else ReturnByte(0) = bHeader(1) ReturnByte(1) = bHeader(2) ReturnByte(2) = bHeader(3) For i = 3 To LOF(1) - 1 Get #1, , ReturnByte(i) Next i End If ' 关闭文件 Close #1 ' 转换UTF-8数组为字符串 lngBufferSize = UBound(ReturnByte) + 1 strBuffer = String$(lngBufferSize, vbNullChar) lngResult = MultiByteToWideChar(65001, 0, ReturnByte(0), _ lngBufferSize, StrPtr(strBuffer), lngBufferSize) readUTF8File = Left(strBuffer, lngResult) Exit Function errHandle: MsgBox Err.Description, , "错误 - " & Err.Number readUTF8File = "" End Function ' 读取UTF8文件测试 Sub readFileTest() Dim strFile As String Dim strContent As String Dim strSaveFile As String ' 获取文件名和路径 strFile = Application.GetOpenFilename("文本文件,*.txt", , "打开文本文件") If strFile = "False" Then Exit Sub strContent = readUTF8File(strFile) If MsgBox("是否需要保存转换好的ANSI文本?", vbYesNo, "保存") = vbYes Then strSaveFile = Application.GetSaveAsFilename(Mid(strFile, InStrRev(strFile, "/") + 1), "文本文件,*.txt") If strSaveFile = "False" Then Exit Sub Open strSaveFile For Binary As #1 Put #1, , strContent Close #1 End If End Sub ' 写入UTF8文件测试 Sub writeFileTest() Dim strFile As String Dim strContent As String strContent = "这是一个UTF8文档测试" strFile = Application.GetSaveAsFilename("", "文本文件,*.txt") If strFile = "False" Then Exit Sub 'WriteUTF8File strContent, strFile WriteUTF8File strContent, strFile, False End Sub
Access数据库自身
- office课程播放地址及课程明细
- Excel Word PPT Access VBA等Office技巧学习平台
- 将( .accdb) 文件格式数据库转换为早期版本(.mdb)的文件格式
- 将早期的数据库文件格式(.mdb)转换为 (.accdb) 文件格式
- KB5002984:配置 Jet Red Database Engine 数据库引擎和访问连接引擎以阻止对远程数据库的访问(remote table)
- Access 365 /Access 2019 数据库中哪些函数功能和属性被沙箱模式阻止(如未启动宏时)
- Access Runtime(运行时)最全的下载(2007 2010 2013 2016 2019 Access 365)
Access Activex第三方控件
- Activex控件或Dll 在某些电脑无法正常注册的解决办法(regsvr32注册时卡住)
- office使用部分控件时提示“您没有使用该ActiveX控件许可的问题”的解决方法
- RTF文件(富文本格式)的一些解析
- Access树控件(treeview) 64位Office下出现横向滚动条不会自动定位的解决办法
- Access中国树控件 在win10电脑 节点行间距太小的解决办法
- EXCEL 2019 64位版(Office 2019 64位)早就支持64位Treeview 树控件 ListView列表等64位MSCOMMCTL.OCX控件下载
- VBA或VB6调用WebService(直接Post方式)并解析返回的XML
Access ADP Sql Server等
- 早期PB程序连接Sqlserver出现错误
- MMC 不能打开文件C:/Program Files/Microsoft SQL Server/80/Tools/Binn/SQL Server Enterprise Manager.MSC 可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版
- sql server连接不了的解决办法
- localhost与127.0.0.1区别
- Roych的浅谈数据库开发系列(Sql Server)
- sqlserver 自动备份对备份目录没有存取权限的解决办法
- 安装Sql server 2005 express 和SQLServer2005 Express版企业管理器 SQLServer2005_SSMSEE
文章分类
联系我们
联系人: | 王先生 |
---|---|
Email: | 18449932@qq.com |
QQ: | 18449932 |
微博: | officecn01 |