我使用JSON对数组进行编码,我得到一个这样的字符串:
{"name":"\u00fe\u00fd\u00f0\u00f6\u00e7"}
现在我需要将其转换为ISO-8859-9。我尝试了以下但它失败了:
header('Content-type: application/json; charset=ISO-8859-9');
$json = json_encode($response);
$json = utf8_decode($json);
$json = mb_convert_encoding($json, "ISO-8859-9", "auto");
echo $json;
它似乎无法奏效。我错过了什么?
感谢您的时间。
答案 0 :(得分:2)
你可以这样做:
$json = json_encode($response);
header('Content-type: application/json; charset=ISO-8859-9');
echo mb_convert_encoding($json, "ISO-8859-9", "UTF-8");
假设$response
中的字符串是utf-8。但我强烈建议你一直使用utf-8。
编辑:对不起,刚刚意识到这将无效,因为json_encode
将unicode点作为javascript转义码转义。您必须先将这些转换为utf-8序列。我不认为有任何内置功能,但您可以使用稍微修改后的this library变体来实现。请尝试以下方法:
function unicode_hex_to_utf8($hexcode) {
$arr = array(hexdec(substr($hexcode[1], 0, 2)), hexdec(substr($hexcode[1], 2, 2)));
$dest = '';
foreach ($arr as $src) {
if ($src < 0) {
return false;
} elseif ( $src <= 0x007f) {
$dest .= chr($src);
} elseif ($src <= 0x07ff) {
$dest .= chr(0xc0 | ($src >> 6));
$dest .= chr(0x80 | ($src & 0x003f));
} elseif ($src == 0xFEFF) {
// nop -- zap the BOM
} elseif ($src >= 0xD800 && $src <= 0xDFFF) {
// found a surrogate
return false;
} elseif ($src <= 0xffff) {
$dest .= chr(0xe0 | ($src >> 12));
$dest .= chr(0x80 | (($src >> 6) & 0x003f));
$dest .= chr(0x80 | ($src & 0x003f));
} elseif ($src <= 0x10ffff) {
$dest .= chr(0xf0 | ($src >> 18));
$dest .= chr(0x80 | (($src >> 12) & 0x3f));
$dest .= chr(0x80 | (($src >> 6) & 0x3f));
$dest .= chr(0x80 | ($src & 0x3f));
} else {
// out of range
return false;
}
}
return $dest;
}
print mb_convert_encoding(
preg_replace_callback(
"~\\\\u([1234567890abcdef]{4})~", 'unicode_hex_to_utf8',
json_encode($response)),
"ISO-8859-9", "UTF-8");
答案 1 :(得分:1)
正如您在PHP documentation site JSON编码/解码函数中看到的那样,只能使用utf8编码,因此尝试更改此操作会导致一些数据问题,您可能会遇到意外和错误的结果。