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.