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

SQLSRV连接MSSQL时阿拉伯文NVARCHAR字段显示异常问题

解决SQLSRV连接MSSQL输出NVARCHAR阿拉伯文的编码问题

问题分析

核心问题分为两点:

  • 初始输出问号是因为数据库连接未指定正确字符集,导致阿拉伯文数据转码失败;
  • 添加"CharacterSet" => "UTF-8"后出现\u0635\u0646\u0641这类转义字符,是json_encode的默认行为——它会将非ASCII字符转为Unicode转义序列;手动解码后变回问号,大概率是解码逻辑错误或输出环节的字符集冲突。

解决方案

调整json_encode参数和代码逻辑即可解决:

  • 使用JSON_UNESCAPED_UNICODE参数让json_encode直接输出UTF-8编码的阿拉伯文,避免转义;
  • 统一收集查询结果后再输出JSON,避免生成多个独立的JSON片段(不符合标准JSON格式);
  • 保留已设置的正确字符集配置和响应头。

修正后的代码

$connectionInfo = array( 
    "Database"=>"VarrOne_DataBAse",
    "TrustServerCertificate"=>true, 
    "CharacterSet" => "UTF-8"
);
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) {
    $sql = "SELECT ProductName FROM ItemData";
    $stmt = sqlsrv_query( $conn, $sql);
    if( $stmt === false ) {
         die( print_r( sqlsrv_errors(), true));
    }
    
    // 统一收集所有结果
    $results = [];
    while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
        $results[] = $row['ProductName'];
    }
    
    // 设置响应头并输出标准JSON
    header("Content-Type: application/json; charset=utf-8");
    echo json_encode($results, JSON_UNESCAPED_UNICODE);

    sqlsrv_free_stmt( $stmt);
}

额外验证点

  • 确认数据库中ProductName字段的阿拉伯文数据存储正常(可通过SSMS直接查看);
  • 确保Apache和PHP默认字符集已设为UTF-8(php.ini中default_charset = "UTF-8",Apache配置中AddDefaultCharset UTF-8),避免输出环节二次转码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:53:26