问题描述
|
不幸的是,我正在使用基于MSsql的数据源,并试图将其集成到用PHP编写的自定义Drupal模块中。我的问题是,无论我使用哪种包装器功能,我都无法使撇号正确显示在页面上。它们都变成问号。另外,枚举符也做同样的事情。
我知道这是一个编码问题。该页面使用UTF-8编码,但是数据库使用sql_latin1_General_CP1_CI_AS编码。我无法控制数据库结构,因此无法修改。我没有选择更改数据库中所有值的选项。
如何以不损坏的形式访问此数据,或者至少使PHP正确地将其吐出?
我尝试过,但没有成功:
utf_encode
utf_decode
html_entities
图标
几个自定义编码的str_replace函数
MSsql没有SET NAMES函数
救命!
解决方法
您是否尝试过显式转换输出?例如:
select col1 COLLATE Latin1_General_100_CI_AS from table1
根据MSDN上的“排序规则和Unicode支持”页面,支持Unicode 5.0,尽管您可能需要强制使用较新的* _100排序规则才能利用新功能。另一页声称SQL Server不支持UTF-8,但支持UTF-16 IS。
您可以使用内置TVF仔细阅读支持的排序规则的整个列表:
select * from fn_helpcollations()
,当您使用的是不支持新排序规则的旧版SQL Server时,您是否尝试过将数据作为NVARCHAR投射出去?
例如:
SELECT CONVERT(NVARCHAR(MAX),col1) FROM table1
在“管理客户端/服务器代码页之间的数据转换”上有一个MSDN页面,其中提供了一些常规信息。通常,建议似乎围绕修改连接的细节或数据库结构(鉴于当前的限制,您不可能说)。特别,
代码的最佳选择
页面特定的服务器要进行通信
仅与使用相同的客户端
代码页。第二好的选择是
使用另一个具有
几乎相同的字符集。 [...]
如果您必须与客户沟通
使用不同的代码页,
支持的解决方案是存储您的
Unicode列中的数据。如果有
这些选择不可行,
另一种选择是存储数据
在使用二进制的二进制列中
varbinary或varbinary(max)数据
类型。但是,二进制数据只能
以二进制排序和比较
订购。这使其不那么灵活
比字符数据。