找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 162|回复: 1

UTF8编码文件直接导入为UNICODE编码

[复制链接]
发表于 2025-1-25 08:47:34 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 tlwh163 于 2025-1-25 09:13 编辑
  1. 'Private Declare Function CreateFileW Lib "kernel32" (ByVal lpFileName As Long, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
  2. 'Private Const GENERIC_READ = &H80000000
  3. 'Private Const FILE_SHARE_READ = &H1
  4. 'Private Const OPEN_EXISTING = &H3
  5. 'Private Const FILE_ATTRIBUTE_NORMAL = &H80

  6. 'Private Declare Function CreateFileMappingW Lib "kernel32" (ByVal hFile As Long, lpFileMappigAttributes As Any, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As Long) As Long
  7. 'Private Const PAGE_READONLY = &H2

  8. 'Private Declare Function MapViewOfFile Lib "kernel32" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long
  9. 'Private Const SECTION_MAP_READ = &H4
  10. 'Private Const FILE_MAP_READ = SECTION_MAP_READ

  11. 'Private Declare Function UnmapViewOfFile Lib "kernel32" (lpBaseAddress As Any) As Long
  12. 'Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

  13. 'Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
  14. 'Private Const CP_UTF8 = 65001

  15. 'Private Const INVALID_HANDLE_VALUE = -1


  16. ''读取指定UTF8编码的文件内容并转为UNICODE编码,函数返回转码后的字符串数据
  17. Public Function ReadUtf8FileToString(ByRef Utf8FileName As String) As String
  18.     Dim hFile As Long
  19.     Dim hFmap As Long
  20.     Dim m As Long, w As Long, n As Long                         '文件可以被正确打开
  21.     hFile = CreateFileW(StrPtr(Utf8FileName), GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
  22.     If hFile <> INVALID_HANDLE_VALUE Then                       '创建文件映射
  23.         hFmap = CreateFileMappingW(hFile, ByVal 0&, PAGE_READONLY, 0, 0, 0)
  24.         If hFmap Then
  25.             m = MapViewOfFile(hFmap, FILE_MAP_READ, 0, 0, 0)    '映射文件到视图
  26.             ''这里可以先校验一下文件内容是否是UTF8编码
  27.             ''不校验也行, MultiByteToWideChar 会自动鉴定的
  28.             ''参见: https://www.0xaa55.com/thread-27516-1-2.html
  29.             If m Then
  30.                 n = MultiByteToWideChar(CP_UTF8, 0, m, -1, 0, 0)
  31.                 If n Then                                       '文件的内容可以转换为UNICODE
  32.                     ReadUtf8FileToString = String(n, 0)
  33.                     w = StrPtr(ReadUtf8FileToWString)           '输出W字符串
  34.                     If w Then Call MultiByteToWideChar(CP_UTF8, 0, m, -1, w, n)
  35.                 End If:  UnmapViewOfFile m                      '取消映射视图
  36.             End If:      CloseHandle hFmap                      '文件映射必须关闭
  37.         End If:          CloseHandle hFile                      '文件句柄必须关闭
  38.     End If
  39. End Function
复制代码
回复

使用道具 举报

发表于 2025-1-29 20:14:45 | 显示全部楼层
啥也不说了,帖子就是带劲!
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2025-2-23 01:01 , Processed in 0.029926 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表