【发布时间】:2017-01-30 21:15:00
【问题描述】:
我很惊讶我无法通过搜索找到这个问题的直接答案。
我有一个接受用户输入的 PHP 网络应用程序。由于应用程序的性质,用户可能经常使用扩展的 ASCII 字符(也称为“ALT 代码”)。
我目前的具体问题是 ALT 代码 26,它是一个右箭头 (→)。这将与其他文本一起存储在同一字段中(例如,'this→that')。
我的列类型是 NVARCHAR。
这是我尝试过的:
我尝试过不进行任何转换,只是照常插入值,但该值被存储为
thisâ??that。我尝试在 PHP 中使用
iconv('UTF-8', 'UCS-2', $value)将值转换为 UCS-2,但我收到错误消息Unclosed quotation mark after the character string 't'.。查询最终如下所示:UPDATE myTable SET myColumn = 'this�!that'。我已尝试进行上述转换,然后在引用的值前添加一个 N,但我收到相同的错误消息。查询如下所示:
UPDATE myTable SET myColumn = N'this�!that'。我已尝试删除 UCS-2 转换并仅在引用值前添加 N,查询再次运行,但值存储为
thisâ that。我曾尝试在 PHP 中使用
utf8_decode($value),但箭头只是替换为问号。
那么任何人都可以回答这个(看似简单的)问题,我如何将这个值存储在我的数据库中,然后按照最初输入的方式检索它?
我使用的是 PHP 5.5 和 MSSQL 2012。如果有任何驱动程序/操作系统版本的问题,它是通过 FreeTDS 连接的 Linux 服务器。这是不可能改变的。
【问题讨论】:
-
你确定sql server中存储的值不正确吗? SSMS 并不总是能很好地显示扩展集中的字符。您可以检查该字符的实际 unicode 值。听起来您可能需要在 PHP 端做一些事情才能使其对扩展字符集有效。
-
回答这个问题:“我已经尝试在 PHP 中使用 utf8_decode($value),但是箭头被替换为问号。”,这可能是因为没有表示该值在 ISO-8859-1 字符集中。 utf8_decode 将字符串转换为 ISO-8859-1 字符集。
-
@SeanLange:当从数据库中检索到值以显示在应用程序中时,它会按照我提到的方式显示(损坏)。
-
我会在数据库中查看实际存储的值。您可以使用 UNICODE 函数来获取有问题的字符的代码。
-
@georaldc:是的,我知道为什么会这样。我刚刚提到这是我尝试过的事情之一,以防止任何人建议尝试。
标签: php sql-server sql-server-2012 freetds php-5.5