VBA WinHttpRequest调用PHP读取MySQL西里尔文乱码问题求助
解决VBA WinHttpRequest获取西里尔文乱码问题
我来帮你搞定这个西里尔文乱码的事儿,核心问题是编码处理的全链路没对齐——从数据库读取、PHP输出到VBA接收,每一步都得保证编码一致才行。咱们一步步调整:
第一步:修复PHP端的编码配置
你当前的PHP代码有两个关键问题:
- 数据库连接后没指定UTF-8编码,导致从
phrases表读取西里尔文时可能已经乱码 - 没有给客户端(VBA)明确返回内容的编码类型
修改后的PHP代码如下:
<?php $PID = $_POST['PID']; require_once ('config.php'); // 新增:设置数据库连接编码为UTF-8 mysql_set_charset('utf8'); if(!$PID>0){ die("##### Error: getNewestPID failed - PID='" . $PID . "' #####"); } $phrases = mysql_query("SELECT * FROM phrases WHERE (PID > '$PID')"); if(!$phrases){ die("##### Error: getNewestPID SELECT failed - PID=" . $PID . " - " . mysql_error() . " #####"); } // 新增:告诉VBA返回的内容是UTF-8编码 header('Content-Type: text/plain; charset=utf-8'); echo "data="; while($row = mysql_fetch_array($phrases)) { echo $row[0] . "|" . $row[1] . "|" . $row[2] . "|" . $row[3]; } mysql_close($db); ?>
注意:
mysql_*系列函数已经被废弃,建议后续迁移到mysqli或PDO,但先针对你现有代码修复。
第二步:调整VBA端的解码方式
WinHttpRequest的ResponseText会根据系统默认编码自动转码,这很容易导致UTF-8内容乱码。正确的做法是读取二进制的ResponseBody,用ADODB.Stream解码为UTF-8字符串。
修改后的VBA代码:
Dim objHTTP As New WinHttp.WinHttpRequest Dim objStream As New ADODB.Stream Dim strResponse As String With objHTTP .Open "POST", "http://www.dname.com/ruski/php/getNewestPID.php", True .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8" .Send "PID=" & lngPID .WaitForResponse ' 用ADODB.Stream处理二进制响应,解码为UTF-8 With objStream .Type = adTypeBinary .Open .Write objHTTP.ResponseBody .Position = 0 .Type = adTypeText .Charset = "UTF-8" strResponse = .ReadText .Close End With End With Debug.Print strResponse Set objStream = Nothing Set objHTTP = Nothing
记得确保你的VBA项目引用了
Microsoft ActiveX Data Objects 6.x Library(或对应版本),不然ADODB.Stream会报错。
为什么之前的尝试失败?
- 你用ADODB.Stream转成Windows-1251:实际上返回的内容是UTF-8,转成1251相当于二次编码,自然乱码
- PHP端转成Windows-1251:VBA端默认可能还是用系统编码读取,加上转码过程中丢失了字符,导致乱码
现在按上面的步骤修改后,全链路都是UTF-8编码,西里尔文就能正常显示了。
内容的提问来源于stack exchange,提问作者user3305711
相关产品推荐
相关产品推荐

