本帖最后由 tlwh163 于 2025-1-25 09:13 编辑
- '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
- 'Private Const GENERIC_READ = &H80000000
- 'Private Const FILE_SHARE_READ = &H1
- 'Private Const OPEN_EXISTING = &H3
- 'Private Const FILE_ATTRIBUTE_NORMAL = &H80
- '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
- 'Private Const PAGE_READONLY = &H2
- '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
- 'Private Const SECTION_MAP_READ = &H4
- 'Private Const FILE_MAP_READ = SECTION_MAP_READ
- 'Private Declare Function UnmapViewOfFile Lib "kernel32" (lpBaseAddress As Any) As Long
- 'Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
- '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
- 'Private Const CP_UTF8 = 65001
- 'Private Const INVALID_HANDLE_VALUE = -1
- ''读取指定UTF8编码的文件内容并转为UNICODE编码,函数返回转码后的字符串数据
- Public Function ReadUtf8FileToString(ByRef Utf8FileName As String) As String
- Dim hFile As Long
- Dim hFmap As Long
- Dim m As Long, w As Long, n As Long '文件可以被正确打开
- hFile = CreateFileW(StrPtr(Utf8FileName), GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
- If hFile <> INVALID_HANDLE_VALUE Then '创建文件映射
- hFmap = CreateFileMappingW(hFile, ByVal 0&, PAGE_READONLY, 0, 0, 0)
- If hFmap Then
- m = MapViewOfFile(hFmap, FILE_MAP_READ, 0, 0, 0) '映射文件到视图
- ''这里可以先校验一下文件内容是否是UTF8编码
- ''不校验也行, MultiByteToWideChar 会自动鉴定的
- ''参见: https://www.0xaa55.com/thread-27516-1-2.html
- If m Then
- n = MultiByteToWideChar(CP_UTF8, 0, m, -1, 0, 0)
- If n Then '文件的内容可以转换为UNICODE
- ReadUtf8FileToString = String(n, 0)
- w = StrPtr(ReadUtf8FileToWString) '输出W字符串
- If w Then Call MultiByteToWideChar(CP_UTF8, 0, m, -1, w, n)
- End If: UnmapViewOfFile m '取消映射视图
- End If: CloseHandle hFmap '文件映射必须关闭
- End If: CloseHandle hFile '文件句柄必须关闭
- End If
- End Function
复制代码 |
|