我的数据库使用ISO-8859-1,我通过sqlsrv_query
获取数据。有一些字符,如“
,获取数据后,我使用utf8_encode()
函数。
然后我用以下设置回送数据回Ajax请求:
header('Content-Type: application/json');
echo json_encode($Data);
我通过responseJSON捕获数据,一切都很好,但这里有一个错误编码的例子:
{"Products":{"1":{"ProductID":"1","Name":"Testproduct'u0084Foobar'u0093"}}}
与'u0093
应该是“
,但它不是,它有错误的Unicode,它应该是'u201C
或甚至没有被分割成Unicode。
我做错了什么吗?
ISO 8859-1不包括弯曲引号字符,如“
;在维基百科上可以看到,字符0x93
是未定义的,保留用作控制字符。
然而,当人们指定ISO 8859-1时,他们通常实际上是指Windows代码页1252,它用额外的字符替换这个保留的块,包括弯曲的引号。0x93
在Windows-1252中确实是“
,因此可以合理地假设这是您的数据库实际配置的。
由于utf8_encode
只处理ISO 8859-1,因此您需要使用不同的函数来转换为Unicode编码。有两个这样的函数捆绑在标准PHP发行版中,来自不同的扩展:
-
iconv
-类似于$utf8_string = iconv('Windows-1252', 'UTF-8', $db_string);
-
mb_convert_encoding
-类似于$utf8_string = mb_convert_encoding($db_string, 'UTF-8', 'Windows-1252');