2013-05-11 4 views
79

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

यहाँ मैं क्या दिखाई दे रही है की एक उदाहरण है:

इनपुट

echo $text; 

आउटपुट

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

इनपुट

json_encode($text); 

आउटपुट

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

उत्तर

180

PHP/5.4.0 के बाद, "JSON_UNESCAPED_UNICODE" नामक एक विकल्प है। इसे देखें:

http://se2.php.net/json_encode

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

json_encode($text, JSON_UNESCAPED_UNICODE); 
+2

आह। धन्यवाद! मुझे दस्तावेज़ीकरण को और सावधानीपूर्वक पढ़ना चाहिए था। धन्यवाद। –

+2

मुझे आश्चर्य है कि इसे डिफ़ॉल्ट के रूप में सेट करने का कोई तरीका है या नहीं। –

+3

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

47

JSON_UNESCAPED_UNICODE पीएचपी संस्करण पर उपलब्ध है 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 iee अपरकेस नहीं होना चाहिए? – malhal

+3

PHP <5.4;) – qdev

+0

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

-4

Is this the expected behavior?

json_encode() केवल UTF-8 एन्कोडेड डेटा के साथ काम करता है।

हो सकता है आप इसे यहाँ कन्वर्ट करने के लिए एक जवाब प्राप्त कर सकते हैं: cyrillic-characters-in-phps-json-encode

-1

जब से तुम से पूछा:

Is there any way to convert the output to UTF-8 characters?

एक अन्य समाधान utf8_encode उपयोग करने के लिए है।

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

उदा।

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

echo json_encode($rows); 
+0

इसका उपयोग न करें। जैसा कि PHP दस्तावेज़ पृष्ठ में बताया गया है, utf8_encode केवल तभी उपयुक्त है जब आपकी मूल स्ट्रिंग आईएसओ -885 9 -1 (लैटिन 1) एन्कोडेड हो। यह एक पूरा उद्देश्य नहीं है "सुनिश्चित करें कि यह स्ट्रिंग utf-8 एन्कोडेड है" फ़ंक्शन। – telomere

संबंधित मुद्दे