我在使用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会破坏我的字符串而我无法弄清楚还有什么可以尝试。我将不胜感激任何帮助:)
谢谢!
答案 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
将中间结果写入可以使用十六进制编辑器检查的文件。这将有助于确认该过程的特定步骤的输出是否正确。