- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在使用 DomDocument 使用 PHP 生成一个 XML 文件,我需要处理亚洲字符。我使用 pdo_mssql 驱动程序从 MSSQL2008 服务器中提取数据,并对 XML 属性值应用 utf8_encode()。只要没有特殊字符,一切正常。
服务器是MS SQL Server 2008 SP3
数据库、表和列排序规则都是SQL_Latin1_General_CP1_CI_AS
我正在使用 PHP 5.2.17
这是我的 PDO 对象:
$pdo = new PDO("mssql:host=MyServer,1433;dbname=MyDatabase", user123, password123);
我的查询是一个基本的 SELECT。
我知道将特殊字符存储到 SQL_Latin1_General_CP1_CI_AS 列中不是很好,但理想情况下最好让它在不更改它的情况下工作,因为其他非 PHP 程序已经使用该列并且它工作正常。在 SQL Server Management Studio 中,我可以正确地看到亚洲字符。
考虑到以上所有细节,我应该如何处理数据?
最佳答案
我找到了解决方法,希望这对某人有所帮助。
首先,SQL_Latin1_General_CP1_CI_AS 是 CP-1252 和 UTF-8 的奇怪组合。基本字符是 CP-1252,所以这就是为什么我只需要使用 UTF-8 就可以正常工作的原因。亚洲和其他 UTF-8 字符编码为 2 个字节,而 php pdo_mssql 驱动程序似乎讨厌不同长度的字符,因此它似乎对 varchar(而不是 nvarchar)进行 CAST,然后所有 2 字节字符都变成问号(' ?')。
我通过将它转换为二进制来修复它,然后我用 php 重建文本:
SELECT CAST(MY_COLUMN AS VARBINARY(MAX)) FROM MY_TABLE;
在 php 中:
//Binary to hexadecimal
$hex = bin2hex($bin);
//And then from hex to string
$str = "";
for ($i=0;$i<strlen($hex) -1;$i+=2)
{
$str .= chr(hexdec($hex[$i].$hex[$i+1]));
}
//And then from UCS-2LE/SQL_Latin1_General_CP1_CI_AS (that's the column format in the DB) to UTF-8
$str = iconv('UCS-2LE', 'UTF-8', $str);
关于php - 将 SQL_Latin1_General_CP1_CI_AS 编码为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10124930/
我是一名优秀的程序员,十分优秀!