Вы можете сделать:
$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 как escape-коды JavaScript. Сначала вам придется преобразовать их в последовательности utf-8. Я не думаю, что для этого есть какие-либо встроенные функции, но вы можете использовать слегка измененный вариант этой библиотеки , чтобы туда попасть. Попробуйте следующее:
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");