PHP json_encode फ़ंक्शन UTF-8 स्ट्रिंग्स को हेक्साडेसिमल संस्थाओं में क्यों परिवर्तित करता है?


148

मेरे पास एक PHP स्क्रिप्ट है जो विभिन्न प्रकार की भाषाओं से संबंधित है। दुर्भाग्य से, जब भी मैं उपयोग करने की कोशिश करता हूं json_encode, तो कोई भी यूनिकोड आउटपुट हेक्साडेसिमल संस्थाओं में बदल जाता है। क्या यह अपेक्षित व्यवहार है? क्या आउटपुट को UTF-8 वर्ण में बदलने का कोई तरीका है?

यहाँ एक उदाहरण है जो मैं देख रहा हूँ:

इनपुट

echo $text;

आउटपुट

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

इनपुट

json_encode($text);

आउटपुट

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

जवाबों:


355

PHP / 5.4.0 के बाद से, वहाँ एक विकल्प कहा जाता है "JSON_UNESCAPED_UNICODE"। इसकी जांच - पड़ताल करें:

http://se2.php.net/json_encode

इसलिए आपको प्रयास करना चाहिए:

json_encode( $text, JSON_UNESCAPED_UNICODE );

3
अहा। धन्यवाद! मुझे प्रलेखन को अधिक ध्यान से पढ़ना चाहिए था। धन्यवाद।
डेविड जोन्स

3
JSON_UNESCAPED_UNICODE को PHP 5.4.0 में पेश किया गया था, और पहले के संस्करणों में उपलब्ध नहीं है। पूर्व संस्करणों में इसका उपयोग करते समय आपको यह त्रुटि मिलेगी: "चेतावनी: json_encode () पैरामीटर 2 के लंबे होने, स्ट्रिंग में दिए जाने की उम्मीद करता है ..."। 5.3 समाधान के लिए नीचे CertaiN का जवाब देखें।
ऑक्टेवियन निकु

यह डेनिश अक्षरों के साथ भी काम करता है Ø, letters, letters, ø,, å धन्यवाद!
ymerdrengene

शानदार, यह वह उत्तर था जिसकी मुझे तलाश थी!
रैंडमाइज़र

2
आपने मेरी जान बचा ली। धन्यवाद।
जॉन जांगितु

57

JSON_UNESCAPED_UNICODE PHP संस्करण 5.4 या बाद के संस्करण पर उपलब्ध है।
निम्न कोड संस्करण 5.3 के लिए है।

UPDATED

  • html_entity_decodepack+ से थोड़ा अधिक कुशल है mb_convert_encoding
  • (*SKIP)(*FAIL)खुद को पीछे छोड़ता है और JSON_HEX_*झंडे द्वारा वर्ण निर्दिष्ट करता है ।

 

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 be \ U यानी अपरकेस नहीं होना चाहिए?
मल्हल

4
PHP <5.4;) के लिए अच्छा समाधान
qdev

मैं संस्करण 5.3 के लिए इस समाधान को खोजने के लिए 3 दिनों की तलाश कर रहा था क्योंकि मेरा होस्ट 5.4 में अपग्रेड नहीं हुआ था। मेरे लिए आप एक लाइफ सेवर हैं और इतना पूरा होने के लिए मैं इसे स्वीकार किए गए उत्तर के रूप में चिह्नित करूंगा!
लैसी

स्ट्रिंग होने पर फिक्स्ड बग \\ । नए संस्करण की \\ तुलना में उच्च प्राथमिकता पर पकड़ लेता है \u
mpyw

इसे php लाइब्रेरी में जोड़ा जाना चाहिए। बहुत बढ़िया।
बेरकी

7

आप चारसेट और अनस्कैप्ड यूनिकोड सेट करना पसंद करते हैं

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

4

एक समाधान पहले डेटा को एनकोड करना है और फिर उसी फाइल में डिकोड करना है:

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

1

यहाँ विभिन्न PHP संस्करणों के लिए मेरा संयुक्त समाधान है।

मेरी कंपनी में हम विभिन्न PHP संस्करणों के साथ विभिन्न सर्वरों के साथ काम कर रहे हैं, इसलिए मुझे सभी के लिए काम करने वाले समाधान खोजने थे।

$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));
}

क्रेडिट के लिए जाना चाहिए मार्को गस्सी और अबू । PHP> = 5.4 का समाधान json_encode डॉक्स में प्रदान किया गया है।


0

Raw_json_encode () फ़ंक्शन ऊपर ने मुझे समस्या का समाधान नहीं किया (किसी कारण से, कॉलबैक फ़ंक्शन ने मेरे PHP 5.2.5 सर्वर पर एक त्रुटि उठाई)।

लेकिन यह अन्य समाधान वास्तव में काम करता था।

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

क्रेडिट मार्को गस्सी को जाना चाहिए । मैं सिर्फ json_encode () को कॉल करने के बजाय उनके फ़ंक्शन को कॉल करता हूं:

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

जब से आपने पूछा:

क्या आउटपुट को UTF-8 वर्ण में बदलने का कोई तरीका है?

एक अन्य उपाय utf8_encode का उपयोग करना है ।

यह आपके स्ट्रिंग को एन्कोड करेगा UTF-8

जैसे

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

echo json_encode($rows);

2
यह प्रयोग न करें। जैसा कि PHP doc पेज में कहा गया है, utf8_encode केवल तभी उपयुक्त है जब आपका मूल स्ट्रिंग ISO-8859-1 (लैटिन 1) एन्कोडेड हो। यह एक सब उद्देश्य नहीं है "सुनिश्चित करें कि यह स्ट्रिंग utf-8 एन्कोडेड है" फ़ंक्शन।
टेलोमेयर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.