如何为基于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
相关产品推荐
相关产品推荐

