PHP - 从 sqlsrv 数据库获取 UTF-8 数据

3

我正在尝试从SQL Server数据库中获取一些数据并以JSON格式打印出来,但数据库中的一些数据是UTF-8编码(阿拉伯语)。我搜索了网络并尝试了许多解决方案,但没有一个适用于我。任何帮助将不胜感激。以下是我的代码:

<?php

$serverName = "127.0.0.1"; //serverName\instanceName
$connectionInfo = array( "Database"=>"filmnak_com_", "CharacterSet" => "UTF-8", "UID"=>"filmnak", "PWD"=>"G5j^wk44");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

$sql = "SELECT CAST(ID AS INT) AS ID, CAST(Film AS TEXT) AS Film ,CAST(Name AS TEXT) Name FROM dbo.Movies";

$result = sqlsrv_query( $conn, $sql);
if( $result === false ) {
     die( print_r( sqlsrv_errors(), true));
}

    // looping through all results
    // products node
    $response["Info"] = array();
  while ($row = sqlsrv_fetch_array($result)) {
        // temp user array
        $Info = array();
        $Info["ID"] = $row["ID"] ;
        $Info["Film"] = $row["Film"];

      $Info["Name"] = utf8_decode($row["Name"]);

    echo $row["Name"];
        // push single product into final response array
        array_push($response["Info"], $Info);
    }


echo json_encode($response , JSON_UNESCAPED_UNICODE);

sqlsrv_free_stmt($result);


?>

在浏览器中的结果:
???? ????1+1?????{"Info":[{"ID":8,"Film":"8O9","Name":"???? ????"},{"ID":9,"Film":"9O3","Name":"1+1"},{"ID":10,"Film":"10O5","Name":"?????"}]}

1
你设置了“排序规则”吗?像这样的“Arabic_CI_AI”。 - Karthi
1
请使用类型为 nvarchar(或其他类似的,如 ntextnchar - Karthi
utf8_decode永远不会做你想要的事情。如果你的数据在数据库中是UTF-8编码,而你的连接字符集也是UTF-8,那么PHP将会以UTF-8的形式接收它。PHP可以很好地处理UTF-8,不需要进行任何特殊操作。 - apokryfos
@apokryfos,数据库中的数据是UTF-8编码的,我已将字符集设置为UTF-8,但当我使用echo打印它们时,会显示问号(?????),(echo $row["Name"]; 显示问号,utf8_decode($row["Name"]); 也显示问号) - Arash Mohammadi
没问题,@ArashMohammadi。 - Karthi
显示剩余3条评论
3个回答

17

使用此代码

    $serverName="(local)";
    $connetionInfo = array("DataBase"=>"your db","UID"=>"username","PWD"=>"pass",
                           "CharacterSet" => "UTF-8");<---------------this
    $this->dblink=sqlsrv_connect($serverName,$connetionInfo);

2

连接到sqlsrv服务器时,您需要指定字符集。您可以通过添加CharacterSet参数来实现:

$serverName = "Your server name";
$connectionInfo = [ "Database"=>"your db",  "CharacterSet" =>"UTF-8"];
$conn = sqlsrv_connect( $serverName, $connectionInfo);

1

将数据库排序规则设置为utf8_general_ci


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接