কেন পিএইচপি json_encode ফাংশন ইউটিএফ -8 স্ট্রিংকে হেক্সাডেসিমাল সত্তায় রূপান্তর করে?


148

আমার কাছে একটি পিএইচপি স্ক্রিপ্ট রয়েছে যা বিভিন্ন ধরণের ভাষার সাথে সম্পর্কিত। দুর্ভাগ্যক্রমে, আমি যখনই চেষ্টা করার চেষ্টা করি json_encode, কোনও ইউনিকোড আউটপুট হেক্সাডেসিমাল সত্তায় রূপান্তরিত হয়। এটা কি প্রত্যাশিত আচরণ? ইউটিএফ -8 অক্ষরে আউটপুট রূপান্তর করার কোনও উপায় আছে কি?

আমি যা দেখছি তার উদাহরণ এখানে:

ইনপুট

echo $text;

আউটপুট

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

ইনপুট

json_encode($text);

আউটপুট

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

উত্তর:


355

পিএইচপি / 5.4.0 থেকে, সেখানে একটি বিকল্প বলা হয় "JSON_UNESCAPED_UNICODE"। এটা দেখ:

http://se2.php.net/json_encode

সুতরাং আপনার চেষ্টা করা উচিত:

json_encode( $text, JSON_UNESCAPED_UNICODE );

3
আহা। ধন্যবাদ! আমার ডকুমেন্টেশনটি আরও মনোযোগ সহকারে পড়া উচিত ছিল। ধন্যবাদ।
ডেভিড জোন্স

3
JSON_UNESCAPED_UNICODE পিএইচপি 5.4.0 এ প্রবর্তিত হয়েছিল এবং পূর্ববর্তী সংস্করণগুলিতে অনুপলব্ধ। পূর্ববর্তী সংস্করণগুলিতে এটি ব্যবহার করার সময় আপনি এই ত্রুটিটি পাবেন: "সতর্কতা: json_encode () প্যারামিটার 2 দীর্ঘ হবে, স্ট্রিংটি এতে দেওয়া হবে ..." given 5.3 সমাধানের জন্য নীচে CertaiN এর উত্তর দেখুন।
অক্টাভিয়ান নাইকু

এটি ডেনিশ অক্ষরের সাথেও কাজ করে!, Æ, Ø, ø, Å, å ধন্যবাদ!
ymerdrengene

কল্পনাপ্রসূত, আমি এই উত্তরটি খুঁজছিলাম!
এলোমেলোভাবে

2
আপনি সবেমাত্র আমার জীবন বাঁচিয়েছেন। ধন্যবাদ।
জন জাঙ্গিতু

57

JSON_UNESCAPED_UNICODE পিএইচপি সংস্করণ 5.4 বা তার পরে পাওয়া যাবে।
নিম্নলিখিত কোডটি সংস্করণ 5.3 এর জন্য।

আপডেট

  • 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 \ U অর্থাৎ বড় হাতের হওয়া উচিত নয়?
মলহাল

4
পিএইচপি <5.4;) এর জন্য দুর্দান্ত সমাধান
qdev

আমার হোস্টটি 5.4-তে উন্নীত হয়নি বলে সংস্করণ 5.3-এর জন্য এই সমাধানটি খুঁজতে আমি 3 দিনের সন্ধান করছিলাম। আমার কাছে আপনি জীবন রক্ষাকারী এবং এত সম্পূর্ণ হওয়ার কারণে আমি এটিকে গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করব!
লাকি

স্ট্রিং থাকে যখন স্থির ত্রুটি \\ । এর \\ চেয়ে বেশি অগ্রাধিকারে আরও নতুন সংস্করণ ধরা পড়ে \u
এমপিইউউ

এটি পিএইচপি লাইব্রেরিতে যুক্ত করা উচিত। ভাল করেছ.
বেরাকি


4

একটি সমাধান হ'ল প্রথমে ডেটা এনকোড করা এবং তারপরে একই ফাইলটিতে ডিকোড করা:

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

1

বিভিন্ন পিএইচপি সংস্করণের জন্য এখানে আমার সম্মিলিত সমাধান solution

আমার সংস্থায় আমরা বিভিন্ন পিএইচপি সংস্করণ সহ বিভিন্ন সার্ভারের সাথে কাজ করছি, সুতরাং আমাকে সবার জন্য কাজ করার সমাধান খুঁজে পেতে হয়েছিল।

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

ক্রেডিট যেতে হবে মার্কো Gasi & আবু । পিএইচপি> = 5.4 এর সমাধান json_encode ডক্সে সরবরাহ করা হয়েছে।


0

উপরের কাঁচা_জসন_নকোড () ফাংশনটি আমাকে সমস্যার সমাধান করতে পারে নি (কোনও কারণে কলব্যাক ফাংশনটি আমার পিএইচপি 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

আপনি যেহেতু জিজ্ঞাসা করেছেন:

ইউটিএফ -8 অক্ষরে আউটপুট রূপান্তর করার কোনও উপায় আছে কি?

অন্য সমাধানটি হল utf8_encode ব্যবহার করা ।

এটি আপনার স্ট্রিংটিতে এনকোড করবে UTF-8

যেমন

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

echo json_encode($rows);

2
এটি ব্যবহার করবেন না। পিএইচপি ডক পৃষ্ঠায় বর্ণিত হিসাবে, utf8_encode কেবল তখনই উপযুক্ত যদি আপনার মূল স্ট্রিংটি ISO-8859-1 (লাতিন 1) এনকোডড থাকে। এটি কোনও উদ্দেশ্য নয় "নিশ্চিত করুন যে এই স্ট্রিংটি utf-8 এনকোডড" ফাংশন।
telomere

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.