0

尝试保存带有重音符号的字符串时遇到问题。

我们的在线系统被来自不同国家的客户使用,因此我们的一些客户使用口音。

当请求获取要保存的值时,像这样

$value = trim(strip_tags(htmlspecialchars($_REQUEST['value'], ENT_QUOTES, 'UTF-8')));

它以这种方式保存价值

Gé

如果我使用 htmlentities 而不是 htmlspecialchars 它会像这样保存

géî

我要保存的正确字符串是

我需要正确保存它,以便它可以正确显示在屏幕和报告上。

我们的数据库使用 UTF-16 (MS SQL Server),我在页面上声明元标记使用 UTF-8,如下所示

<meta charset='utf-8'>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>

这是连接的样子:

$link = sqlsrv_connect($dbserver, array(
    'Database'=>$database,
    'UID' => $uid,
    'PWD' => $pwd,
    'CharacterSet' => 'UTF-8'
));
4

2 回答 2

1

经过反复试验,这是我找到的解决方案。

sqlsrv_connect 默认执行连接池,因此连接保留在应用程序池中。

默认情况下,sqlsrv_connect() 使用连接池来提高连接性能。要关闭连接池(即在每次调用时强制建立新连接),请将 $connectionOptions 数组中的“ConnectionPooling”选项设置为 0(或 FALSE)。有关详细信息,请参阅 » SQLSRV 连接池。

来自PHP 手册 - sqlsrv_connect

我的连接曾经是这样的

$link = sqlsrv_connect($dbserver, array(
    'Database'=>$database,
    'UID' => $uid,
    'PWD' => $pwd
));

没有字符集。

即使在将字符集添加到连接之后,我仍然遇到此错误。

这是我现在的连接。

$link = sqlsrv_connect($dbserver, array(
    'Database'=>$database,
    'UID' => $uid,
    'PWD' => $pwd,
    'CharacterSet' => 'UTF-8'
));

在我通过使用元标记强制浏览器使用 UTF-8 后,它正确保存到数据库但显示不正确。这是因为我两次编码为 UTF-8,然后在显示时删除了第二次编码。

毕竟,我做了一个 IIS 重置来重置应用程序池,并强制脚本在处理后关闭连接,如下所示:

// Close the connection.
sqlsrv_close( $linkEventlogic );

它现在可以正常工作。

于 2013-05-08T15:31:12.870 回答
-1

您的方式看起来不错,请尝试:

$string = "\* this is test string *\";
echo utf8_encode($string);

作品?

于 2013-05-08T09:09:41.537 回答