PHP json_encode işlevi neden UTF-8 dizelerini onaltılı varlıklara dönüştürür?


148

Çok çeşitli dillerle ilgilenen bir PHP betiği var. Ne yazık ki, ne zaman kullanmaya çalışsamjson_encode çalışsam, herhangi bir Unicode çıkışı onaltılık varlıklara dönüştürülür. Bu beklenen davranış mı? Çıkışı UTF-8 karakterlerine dönüştürmenin bir yolu var mı?

İşte gördüğüm şeye bir örnek:

GİRİŞ

echo $text;

ÇIKTI

База данни грешка.

GİRİŞ

json_encode($text);

ÇIKTI

"\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438 \u0433\u0440\u0435\u0448\u043a\u0430."

Yanıtlar:


355

PHP / 5.4.0'dan beri, adlı bir seçenek var "JSON_UNESCAPED_UNICODE". Bunu kontrol et:

http://se2.php.net/json_encode

Bu nedenle şunları denemelisiniz:

json_encode( $text, JSON_UNESCAPED_UNICODE );

3
Aha. Teşekkürler! Belgeleri daha dikkatli okumalıydım. Teşekkürler.
David Jones

3
JSON_UNESCAPED_UNICODE, PHP 5.4.0'da kullanılmaya başlandı ve önceki sürümlerde kullanılamıyor. Önceki sürümlerde kullanırken bu hatayı alırsınız: "Uyarı: json_encode () parametre 2'nin uzun olmasını, dize ... 'da verilmesini bekliyor." 5.3 çözümü için aşağıdaki CertaiN cevabına bakınız.
Octavian Naicu

Bu ayrıca Danca harflerle de çalışır æ, æ, Ø, ø, Å, å Teşekkürler!
ymerdrengene

Fantastik, aradığım cevap buydu!
randomizer

2
Sadece hayatımı kurtardın. TEŞEKKÜRLER.
Jon Zangitu

57

JSON_UNESCAPED_UNICODE, PHP 5.4 veya sonraki sürümlerinde kullanılabilir.
Aşağıdaki kod Sürüm 5.3 içindir.

GÜNCELLENMİŞ

  • html_entity_decodepack+ ' dan biraz daha verimlidir mb_convert_encoding.
  • (*SKIP)(*FAIL)kendisi ve belirtilen karakterleri JSON_HEX_*bayraklara göre ters eğik çizgi atlar .

 

function raw_json_encode($input, $flags = 0) {
    $fails = implode('|', array_filter(array(
        '\\\\',
        $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
        $flags & JSON_HEX_AMP ? 'u0026' : '',
        $flags & JSON_HEX_APOS ? 'u0027' : '',
        $flags & JSON_HEX_QUOT ? 'u0022' : '',
    )));
    $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
    $callback = function ($m) {
        return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
    };
    return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
}

1
\ U \ U yani büyük harf olmamalı mı?
malhal

4
PHP için güzel bir çözüm <5.4;)
qdev

Sunucum 5.4 sürümüne geçmediği için Sürüm 5.3 için bu çözümü bulmak için 3 gün arıyordum. Benim için bir Hayat kurtarıcısın ve bu kadar eksiksiz olmak için bunu kabul edilmiş cevap olarak işaretlemeyi tercih ederim!
Laci

Dize içerdiğinde hata düzeltildi \\ . Daha yeni sürüm \\ , daha yüksek önceliğe sahiptir \u.
mpyw

Bu php kütüphanesine eklenmelidir. Aferin.
Beraki

8

Karakter kümesi ve çıkışsız unicode ayarlamak istiyorsunuz

 header('Content-Type: application/json;charset=utf-8');  
 json_encode($data,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);

5

Bir çözüm, önce verileri kodlayıp sonra aynı dosyada kodunu çözmektir:

$string =json_encode($input, JSON_UNESCAPED_UNICODE) ; 
echo $decoded = html_entity_decode( $string );

1

İşte çeşitli PHP sürümleri için kombine çözümüm.

Şirketimde çeşitli PHP sürümlerine sahip farklı sunucularla çalışıyoruz, bu yüzden herkes için çözüm bulmak zorunda kaldım.

$phpVersion = substr(phpversion(), 0, 3)*1;

if($phpVersion >= 5.4) {
  $encodedValue = json_encode($value, JSON_UNESCAPED_UNICODE);
} else {
  $encodedValue = preg_replace('/\\\\u([a-f0-9]{4})/e', "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($value));
}

Krediler Marco Gasi & abu'ya gitmelidir . PHP> = 5.4 için çözüm json_encode belgelerinde sağlanır.


0

Raw_json_encode () işlevi , yukarıda bana sorunu çözmedi (nedense, geri çağırma işlevi benim PHP 5.2.5 sunucuda bir hata kaldırdı).

Ama bu diğer çözüm aslında işe yaradı.

https://www.experts-exchange.com/questions/28628085/json-encode-fails-with-special-characters.html

Krediler Marco Gasi'ye gitmeli . Ben sadece onun yerine json_encode () işlevini çağırmak:

function jsonRemoveUnicodeSequences( $json_struct )
{ 
    return preg_replace( "/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode( $json_struct ) );
}


-2

Sorduğunuzdan beri:

Çıkışı UTF-8 karakterlerine dönüştürmenin bir yolu var mı?

Başka bir çözüm utf8_encode kullanmaktır .

Bu, dizenizi UTF-8 .

Örneğin

foreach ($rows as $key => $row) {
  $rows[$key]["keyword"] = utf8_encode($row["keyword"]);
}

echo json_encode($rows);

2
Bunu kullanma. PHP doc sayfasında belirtildiği gibi, utf8_encode yalnızca orijinal dizeniz ISO-8859-1 (Latin1) kodluysa uygundur. Çok amaçlı bir "bu dizenin utf-8 kodlu olduğundan emin olun" işlevi değildir.
telomere

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.