1

我的项目基于 PHP 构建并连接到 MS SQL Server。我正在使用 sqlsrv 库。MS SQL 中的字段类型是 nvarchar。当我定义连接参数时,我还输入了“utf8”。这是:

global $cnf;
$cnf = array();
$cnf["mssql_user"]  = "xxx";
$cnf["mssql_host"]  = "xxx";
$cnf["mssql_pw"]    = "xxx";
$cnf["mssql_db"]    = "xxx";
$cnf["CharacterSet"]    = "**UTF-8**";

将记录插入数据库时​​,对于越南语内容和中文内容,我使用:

$city = iconv('UTF-8', 'utf-16le', $post['city']);
$params = array(array($city, null, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY)));
$sql= "INSERT INTO tblCityGarden (city) VALUES(?)
$stmt   = sqlsrv_query( $this->dbhandle, $sql, $params);

越南文和中文插入数据OK(越南文和中文数据库中存储的数据是正确的)。

但是,当我将记录加载回网络时,会出现奇怪的字符 (?, �)。我尝试了一些 php 作为 iconv、mb_detect_encoding、mb_convert_encoding 并在互联网上搜索了许多结果,但它无法正常工作。如何显示正确的数据

请有此问题经验的人

4

1 回答 1

1

我遇到了同样的问题 (�),但使用了单引号、双引号和“保留权利”字符……这是我发现的:

  • 指定的CharacterSet似乎是“全部规则”,因此您将其设置为将确定连接的编码(应该如此)。我的连接上没有任何CharacterSet配置。简单地设置这个解决了我的问题,同时确保插入到我的数据库中的值不是通过htmlspecialchars().
  • header() 必须在任何输出之前设置(这非常重要)
  • 标题不能在文档后面设置为不同的东西
  • 有时?>在 PHP 文件中关闭之前和/或之后的尾随空格可能会导致问题(我不使用此结束标记,但我在搜索时看到很多提及)

我不熟悉iconv(),而且我肯定没有一般的编码经验,但我只是通过花时间检查我的标题并确保它们符合上述标准来解决我的问题......

您的查询参数也看起来很奇怪: $params = array(array($city, null, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY)));

我还没有看到传递给该参数的多维数组......(只是一个注释)

于 2015-10-16T18:29:15.320 回答