数据库是 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 不包括弯引号字符,例如 ;可以是 seen on Wikipedia,字符 0x93 未定义,保留用作控制字符。

然而,当人们指定 ISO 8859-1 时,他们实际上通常指的是 Windows codepage 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');