You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA WinHttpRequest调用PHP读取MySQL西里尔文乱码问题求助

解决VBA WinHttpRequest获取西里尔文乱码问题

我来帮你搞定这个西里尔文乱码的事儿,核心问题是编码处理的全链路没对齐——从数据库读取、PHP输出到VBA接收,每一步都得保证编码一致才行。咱们一步步调整:

第一步:修复PHP端的编码配置

你当前的PHP代码有两个关键问题:

  1. 数据库连接后没指定UTF-8编码,导致从phrases表读取西里尔文时可能已经乱码
  2. 没有给客户端(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:48:20