DB是iso-8859-1,使用utf8_encode字符会转换错误


DB is iso-8859-1, using utf8_encode characters get converted wrong

我的数据库使用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');