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

如何为基于ODBC的PDO连接设置字符编码?

解决Pervasive ODBC连接下的UTF-8编码错误

问题背景

项目中出现错误:Malformed UTF-8 characters, possibly incorrectly encoded。论坛现有方案多针对MySQL,但我们使用Pervasive数据库,通过ODBC连接执行Web查询,需设置UTF-8字符集但不知如何操作。添加header('Content-Type: application/json; charset=utf-8')后,错误变为SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data,但开发者工具仍显示原UTF-8错误。

现有代码

<?php 
$conn = new PDO ('odbc:xxx','xxx','xxx');//尝试在odbc后加charset=utf8但失败
$qry = "select distinct name_customer from v_customer_master";
$sql = $conn->query($qry);
//$sql->set_charset("utf8");
//$custName = array();
while($row = $sql->fetch((PDO::FETCH_ASSOC)){
    $custName[] = [$row['name_customer']];
    //array_push($custName,$row['name_customer']);
}
//print_r($custName);
header('Content-Type: application/json; charset=utf-8');//设置后错误变为SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
//但开发者工具仍显示Malformed UTF-8错误。
echo (json_encode($custName,JSON_UNESCAPED_UNICODE));
echo json_last_error_msg(); // 打印错误信息
die(); // 终止脚本
?>

解决方案

1. 配置ODBC连接的字符集参数

Pervasive ODBC不支持在DSN后直接加charset=utf8,需通过专用参数指定:

$conn = new PDO('odbc:DSN=xxx;Client_CSet=UTF-8;Server_CSet=UTF-8', 'xxx', 'xxx');

如果是通过ODBC数据源管理器配置,找到对应Pervasive数据源,进入高级设置,将客户端和服务器字符集均设为UTF-8(代码页65001)。

2. 手动转换查询结果编码

若ODBC层面无法生效,可在获取数据后转换编码(需替换原编码为数据库实际存储的编码,比如GBK、GB2312):

while($row = $sql->fetch(PDO::FETCH_ASSOC)){
    $cleanName = mb_convert_encoding($row['name_customer'], 'UTF-8', '原编码');
    $custName[] = [$cleanName];
}

3. 修复JSON输出的空白/无效字符问题

JSON解析错误通常是输出前存在空白字符(如BOM、代码前的空格):

  • 检查PHP文件开头是否有BOM,确保文件以<?php开头,无多余空格或换行
  • 清理数组中的无效UTF-8字符后再编码:
function sanitizeUtf8($data) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[$key] = sanitizeUtf8($value);
        }
    } elseif (is_string($data)) {
        // 自动修复无效UTF-8序列
        $data = mb_convert_encoding($data, 'UTF-8', 'UTF-8');
    }
    return $data;
}

$custName = sanitizeUtf8($custName);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($custName, JSON_UNESCAPED_UNICODE);

4. 验证数据库字段编码

通过Pervasive管理工具查看v_customer_master视图中name_customer字段的存储编码,确保和客户端设置的UTF-8匹配,避免编码不兼容。

内容的提问来源于stack exchange,提问作者SkylarP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:45:42