php和MySQL的另一个charset问题

时间:2011-01-03 16:00:12

标签: php mysql character-encoding

我在使用PHP和MySQL的网络项目中使用“í”或“ñ”等字符时出现问题。

数据库表采用UTF-8字符集,网页为ISO-8859-1(latin-1)。首先看一切都处理好了,但是当我使用PHP的JSON_ENCODE函数时会出现问题。

当我得到一个查询结果时,让我们说,这一行:

 | ID | VALUE |
 --------------------
 | 1 | Línea |

我在PHP中获得了以下(正确的)数组:

 Array("ID"=>"1","VALUE"=>"Línea");

到目前为止,这么好。但是,当我应用JSON_ENCODE

 $result = json_encode($result);
 //$result is {"id":"1","value":"L"}

然后我尝试了一些编码/解码,但我无法得到正确的结果。

首先,我尝试解码UTF-8字符,如下所示:

 $result['value'] = utf8_decode($result['value']);
 //and I get $result['value'] is "L?a"

然后我尝试使用mb函数:

 $result['value'] = mb_convert_encoding($result['value'],"ISO-8859-1","UTF-8");
 //and I get that $result['value'] is "Lnea"

我真的不知道为什么Json_encode会破坏我的字符串而我无法弄清楚还有什么可以尝试。我将不胜感激任何帮助:)

谢谢!

1 个答案:

答案 0 :(得分:2)

json_encode documentation表示该函数仅适用于UTF-8数据。如果它不适合您,则表示您的数据不是UTF-8。

要了解出现了什么问题,您需要知道connection character set是什么。是UTF-8吗?别的什么?使用SET NAMES utf-8,看看它是否有所不同。

假设连接字符集确实是UTF-8,json_encode应该可以正常工作。然后,您仍然有将编码数据转换为ISO-8859-1的最终问题。例如:

// assume any strings in $result are UTF-8 encoded
$json = json_encode($result);

$output = mb_convert_encoding($json, 'ISO-8859-1', 'UTF-8');

echo $output;

如果它仍然不起作用,则表示您的UTF-8字符串包含ISO-8859-1字符集中不可用的字符。你无能为力。

<强>更新

在调试这样的复杂字符集转换时,可以使用file_put_contents将中间结果写入可以使用十六进制编辑器检查的文件。这将有助于确认该过程的特定步骤的输出是否正确。