gpt4 book ai didi

php - 将 SQL_Latin1_General_CP1_CI_AS 编码为 UTF-8

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:50 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com