【问题标题】:php - sqlsrv encodingphp - sqlsrv 编码
【发布时间】:2013-04-12 11:41:13
【问题描述】:

我的项目基于 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 并在互联网上搜索了许多结果,但它无法正常工作。如何显示正确的数据

请有经验的人解决这个问题

【问题讨论】:

  • 您是否尝试过使用两个不同的连接数组分别插入两种编码类型?那么标准插入的 UTF-8 连接,然后是中文和越南插入的单独 utf-16le 连接?
  • 刚注意到这是一个旧帖子(呵呵)

标签: php


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 有趣的是普通的 htmlspecialchars() 修复了我的故障排除时间。对于每个人来说,如果 sqlsrv_query() 或 mssql_query() 在我的情况下导致某些特殊字符丢失 < 尝试将行的结果包装在该强大的函数中。我做了foreach($row as $key => $value) { if(is_string($value)) { $row[$key] = htmlspecialchars($value); } }
  • @Temitayo - 很高兴您能够解决您的问题!我没那么幸运……如果我没记错的话,我不小心表演了两次htmlspecialchars( $value )。所以,基本上,我有htmlspecialchars( htmlspecialchars( $value ) ) 被执行我的价值观......我相信这是我到达这个线程的重要组成部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多