VB6中使用WinHTTP获取站点波斯语TXT文件时ResponseText乱码问题
VB6中使用WinHTTP获取站点波斯语TXT文件时ResponseText乱码问题
嘿,我来帮你搞定这个波斯语TXT文件乱码的问题~你的代码逻辑没问题,但乱码的核心原因是:服务器上的波斯语文本大概率是UTF-8编码,而WinHTTP的ResponseText会根据响应头里的Content-Type自动解码,如果服务器没明确返回编码信息,它就会用系统默认编码去解析,直接把UTF-8的波斯语字符转成了乱码。
解决思路很简单:跳过WinHTTP自动解码的步骤,直接获取原始二进制数据,再手动转换成正确的UTF-8编码字符串。下面是修改后的完整代码:
首先,你需要在窗体的通用声明部分或者模块里添加API函数声明(VB6需要调用系统API来处理UTF-8转字符串):
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Byte, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long ' 定义UTF-8对应的代码页常量 Const CP_UTF8 = 65001
然后修改你原来的WinHTTP请求代码,改用ResponseBody获取二进制数据,再转换为字符串:
Dim HTTPRequest As WinHttp.WinHttpRequest Dim byteData() As Byte Dim strPersianText As String Set HTTPRequest = New WinHttp.WinHttpRequest With HTTPRequest .Open "GET", "http://mywebsite/msg_app.txt", True .Send If .WaitForResponse(3) Then ' 获取服务器返回的原始二进制数据(避免自动解码乱码) byteData = .ResponseBody ' 调用自定义函数把UTF-8字节转换为VB6可识别的字符串 strPersianText = UTF8ToString(byteData) ' 现在就能正常显示波斯语了 MsgBox strPersianText Else MsgBox "Timed out after 3 seconds." End If End With Set HTTPRequest = Nothing
最后添加这个用来转换UTF-8字节到字符串的自定义函数:
Private Function UTF8ToString(utf8Bytes() As Byte) As String Dim byteLength As Long Dim strBufferLength As Long Dim resultString As String ' 计算UTF-8字节数组的总长度 byteLength = UBound(utf8Bytes) - LBound(utf8Bytes) + 1 ' 先获取转换为Unicode字符串需要的缓冲区长度 strBufferLength = MultiByteToWideChar(CP_UTF8, 0, utf8Bytes(LBound(utf8Bytes)), byteLength, 0, 0) ' 创建对应长度的空字符串作为缓冲区 resultString = String(strBufferLength, 0) ' 执行编码转换 MultiByteToWideChar CP_UTF8, 0, utf8Bytes(LBound(utf8Bytes)), byteLength, StrPtr(resultString), strBufferLength UTF8ToString = resultString End Function
另外要确认一下:服务器上的msg_app.txt文件确实是用UTF-8编码保存的(不要用ANSI,因为波斯语ANSI是Windows-1256,跨环境容易出问题)。用这种方式获取并转换,就能完美显示波斯语内容啦~
备注:内容来源于stack exchange,提问作者Unforgiven
相关产品推荐
相关产品推荐

