JSON চরিত্রের এনকোডিং - ইউটিএফ -8 ব্রাউজারগুলির দ্বারা সু-সমর্থিত বা আমার সংখ্যার অব্যাহতি ক্রমগুলি ব্যবহার করা উচিত?


91

আমি একটি ওয়েবসার্ভিস লিখছি যা এর সংস্থানগুলি উপস্থাপন করতে json ব্যবহার করে এবং জসনকে এনকোড করার সর্বোত্তম উপায় সম্পর্কে আমি কিছুটা আটকে রয়েছি। Json rfc ( http://www.ietf.org/rfc/rfc4627.txt ) পড়লে এটি স্পষ্ট যে পছন্দসই এনকোডিংটি utf-8। তবে আরএফসি বর্ণগুলি নির্দিষ্ট করার জন্য একটি স্ট্রিং পলায়ন প্রক্রিয়াও বর্ণনা করে। আমি ধরে নিই এটি সাধারণত অ-এসিআই অক্ষরগুলি এড়াতে ব্যবহৃত হবে, ফলস্বরূপ ফলাফলটি utf-8 টি বৈধ ascii তৈরি করবে।

সুতরাং আসুন আমি বলি যে আমার কাছে একটি জসন স্ট্রিং রয়েছে যাতে ইউনিকোড অক্ষর রয়েছে (কোড-পয়েন্ট) যা অ-অ্যাস্কি। আমার ওয়েবসার্পিসটি কি কেবলমাত্র utf-8 এ এনকোডিং করে এটিকে ফিরিয়ে দেওয়া উচিত, বা এটি সমস্ত অ-অসি চরিত্রগুলি এড়িয়ে গিয়ে খাঁটি আসকি ফিরে পাওয়া উচিত?

আমি ব্রাউজারগুলি jsonp বা eval ব্যবহার করে ফলাফল সম্পাদন করতে সক্ষম হতে চাই। সে সিদ্ধান্ত কী প্রভাব ফেলে? Utf-8 এর জন্য বিভিন্ন ব্রাউজারের জাভাস্ক্রিপ্ট সমর্থন সম্পর্কে আমার জ্ঞানের অভাব রয়েছে।

সম্পাদনা: আমি স্পষ্ট করে বলতে চেয়েছিলাম যে ফলাফলগুলি কীভাবে এনকোড করতে হবে সে সম্পর্কে আমার প্রধান উদ্বেগ ফলাফলের ব্রাউজার হ্যান্ডলিং সম্পর্কে। আমি যা পড়েছি তা ইঙ্গিত করে যে বিশেষত জেএসএনপি ব্যবহার করার সময় ব্রাউজারগুলি এনকোডিংয়ের প্রতি সংবেদনশীল হতে পারে। আমি বিষয়টিতে সত্যই কোনও ভাল তথ্য পাইনি, সুতরাং কী ঘটেছিল তা দেখার জন্য আমাকে কিছু পরীক্ষার কাজ শুরু করতে হবে। আদর্শভাবে আমি কেবলমাত্র কয়েকটি অক্ষরই পালাতে চাই যা প্রয়োজনীয় এবং কেবলমাত্র utf-8 ফলাফলগুলি এনকোড করে।

উত্তর:


89

জেএসওএন স্পিকে ডিকোডার দ্বারা UTF-8 সমর্থন প্রয়োজন requires ফলস্বরূপ, সমস্ত জেএসওন ডিকোডার ইউটিএফ -8 হ্যান্ডেল করতে পারে ঠিক তেমনি তারা সংখ্যা অব্যাহতি ক্রমগুলিও পরিচালনা করতে পারে। এটি জাভাস্ক্রিপ্ট দোভাষীদের ক্ষেত্রেও রয়েছে, যার অর্থ জেএসওএনপি ইউটিএফ -8 এনকোডেড জেএসওএনও পরিচালনা করবে।

পরিবর্তে JSON এনকোডারদের সংখ্যার অব্যাহতি সিকোয়েন্সগুলি ব্যবহার করার ক্ষমতা কেবল আপনাকে আরও পছন্দ দেয়। আপনি অঙ্কের পালানোর ক্রমগুলি চয়ন করতে পারেন এর একটি কারণ হ'ল যদি আপনার এনকোডার এবং অভিযুক্ত ডিকোডারের মাঝামাঝি কোনও পরিবহন ব্যবস্থা বাইনারি-নিরাপদ না হয়।

আপনি অঙ্কের অব্যাহতি ক্রমগুলি ব্যবহার করতে চাইতে পারেন এমন আরও একটি কারণ হ'ল প্রবাহে উপস্থিত হওয়া নির্দিষ্ট অক্ষরগুলি প্রতিরোধ করা <, &এবং ", যদি এইচটিএমএল এ প্রস্থান না করে JSON কোড স্থাপন করা হয় বা কোনও ব্রাউজার এটি HTML হিসাবে ভুল ব্যাখ্যা করে থাকে তবে এটি HTML অনুক্রম হিসাবে ব্যাখ্যা করা যেতে পারে । এটি এইচটিএমএল ইনজেকশন বা ক্রস-সাইট স্ক্রিপ্টিংয়ের বিরুদ্ধে প্রতিরক্ষা হতে পারে (দ্রষ্টব্য: কিছু অক্ষর জেএসওএন এড়িয়ে যেতে হবে, সহ "এবং \)

পিএসপিএফের জেএসওএন বাস্তবায়ন সহ কিছু ফ্রেমওয়ার্কগুলি এএসসিআইআই এর বাইরের যে কোনও চরিত্রের জন্য এনকোডার দিকে সর্বদা সংখ্যাসূচক সিকোয়েন্সগুলি করে। এটি সীমিত পরিবহন প্রক্রিয়া এবং এর মতো সর্বাধিক সামঞ্জস্যের উদ্দেশ্যে। যাইহোক, এটি জেএসএন ডিকোডারদের ইউটিএফ -8 নিয়ে সমস্যা রয়েছে এমন ইঙ্গিত হিসাবে ব্যাখ্যা করা উচিত নয়।

সুতরাং, আমি অনুমান করি যে আপনি ঠিক ঠিক করতে পারেন যে এর মতো কোনটি ব্যবহার করবেন:

  • এনকোডার এবং ডিকোডারের মধ্যে আপনার স্টোরেজ বা পরিবহনের পদ্ধতি বাইনারি-নিরাপদ না হলে কেবল ইউটিএফ -8 ব্যবহার করুন।

  • অন্যথায়, সংখ্যা অব্যাহতি ক্রম ব্যবহার করুন।


4
"সমস্ত জেএসওন ডিকোডারগুলি ইউটিএফ -8 পরিচালনা করতে পারে" যদিও এটি ব্রাউজারগুলির ক্ষেত্রে সত্য, কেবলমাত্র স্ট্যান্ডার্ডের প্রয়োজনের অর্থ এই নয় যে সমস্ত সফ্টওয়্যার ডিকোডিং জেএসওএন ইউটিএফ -8 সমর্থন করে।
মাইকেল মায়ার

7
"সমস্ত জেএসওন ডিকোডার ইউটিএফ -8 পরিচালনা করতে পারে" আক্ষরিক অর্থেই সত্য। যদি কোনও কিছু ইউটিএফ -8 গ্রহণ করতে না পারে তবে এটি জেএসএন ডিকোডার নয়। এটি কোনও জেএসএন ডিকোডারের মতো হতে পারে তবে এটি অবশ্যই এক নয়।
থোমস্রুটটার

আমি অনুমান করি যে আপনি JSON ডিকোডারটি কী ব্যবহার করছেন তার সংজ্ঞা উপর নির্ভর করে, তবে ন্যায্য বিষয় :)
মাইকেল মায়ার

আরএফসি 8259 ইউটিএফ -8 সমর্থনকে বাধ্যতামূলক হিসাবে নির্দিষ্ট করার কারণটি হ'ল এটিই বিশ্বকে মানিক করেছে। পূর্ববর্তী অপ্রচলিত চশমা স্ট্রিংগুলি ইউনিকোড হিসাবে সংজ্ঞায়িত করেছে তবে কোন এনকোডিংটি নির্দিষ্ট করে নি; বাস্তবায়নগুলি যেভাবেই হোক ইউটিএফ -8 এ প্রমিত করা হয়েছে এবং আপডেট স্পেসটি এটি প্রতিফলিত করে।
থোমাসরুটটার

যতদূর আমি বলতে পারি কোনও নির্দিষ্ট সফ্টওয়্যারের জন্য সেই আরএফসি-তে ইউটিএফ -8 সমর্থন বাধ্যতামূলক হিসাবে নির্দিষ্ট করা হয়নি। ইউটিএফ -8 এর একমাত্র উল্লেখটি হ'ল এটি অবশ্যই বন্ধ সিস্টেমের বাইরে জেএসএনের বিনিময়ের এনকোডিং হিসাবে ব্যবহার করা উচিত। এটি বোঝায় না যে সমস্ত জেএসওন ডিকোডার (আরএফসি তে ব্যবহৃত একটি ভাষা) অবশ্যই ইউটিএফ -8 সমর্থন করবে।
মাইকেল মায়ার

17

আমার সেখানে সমস্যা ছিল আমি যখন JSON "é" এর মতো একটি অক্ষর দিয়ে একটি স্ট্রিং এনকোড করেছি, তখন প্রতিটি ব্রাউজারগুলি "\ u00e9" ফিরে আসবে এমন আইআই বাদে একই "é" প্রদান করবে।

তারপরে পিএইচপি json_decode () এর সাহায্যে এটি "é" খুঁজে পেলে এটি ব্যর্থ হবে, সুতরাং ফায়ারফক্স, অপেরা, সাফারি এবং ক্রোমের জন্য, আমাকে jfon_decode () এর আগে utf8_encode () কল করতে হবে।

দ্রষ্টব্য: আমার পরীক্ষাগুলির সাহায্যে, IE এবং ফায়ারফক্স তাদের নেটিভ JSON অবজেক্টটি ব্যবহার করছে, অন্য ব্রাউজারগুলি json2.js ব্যবহার করছে।


10
সম্ভবত আপনি বোঝানো utf8_encode(), php.net/manual/en/function.utf8-encode.php
বিন্যামীন

4
আইই যদি এটি ডিকোড করতে ব্যর্থ হয় তবে আপনি JSON ডিকোডারটি ব্যবহার করছেন তাতে এটি একটি বাগ। সমস্ত JSON ডিকোডারকে অবশ্যই এনকোডযুক্ত ফর্মটি সাফল্যের সাথে ডিকোড করতে হবে, বা এগুলি জেএসএন ডিকোডার নয়। আপনার সমস্যাটি যেমন json_decode () এর সাথে é অবিরতবিহীন, এটি সম্ভবত আপনি যে পাঠ্যটি এটি খাওয়ালেন সেটি UTF-8 নয়। জেএসএন ডিকোডাররা সর্বদা ইউটিএফ -8 ধরে থাকে, এমনকি পিএইচপি বাস্তবায়ন এমনকি পিএইচপি সাধারণত অন্যান্য অনেক কার্যক্রমে ইউটিএফ -8 ধরে না। অন্যান্য চরিত্রের এনকোডিং রয়েছে যা একটি es আনস্ক্যাপেড অন্তর্ভুক্ত করতে পারে এবং স্ক্রিনে অভিন্ন দেখতে পারে তবে এটি ইউটিএফ -8 নয়। \ UXXXX ফর্মে এনকোডিং এটির জন্য একান্ত কার্যকর।
থোমাসর্টটার

কেবলই বলছেন: জেএসএন বৈধভাবে যে কোনও ইউনিকোড এনকোডিংয়ে আসতে পারে (ইউটিএফ -8, ইউটিএফ -16 বিই / এলই, ইউটিএফ 32 বিই / এলই, বাইট অর্ডার চিহ্নিতকারী বা ছাড়াই)। এবং যেহেতু ASCII UTF-8 এর একটি উপসেট, এটি ASCII এও আসতে পারে। উদাহরণস্বরূপ পার্সাররা ইউটিএফ -32 গ্রহণ করবে কিনা তা আমি জানি না।
gnasher729

4
এটি সঠিক, এবং পার্সারদের ইউটিএফ -8 ব্যতীত অন্য কিছু সমর্থন করার প্রয়োজন নেই। অনুমানটি থেকে: "জেএসএন পাঠ্যটি ইউটিএফ -8, ইউটিএফ -16, বা ইউটিএফ -32 এ এনকোড করা উচিত The ডিফল্ট এনকোডিংটি ইউটিএফ -8, এবং ইউটিএফ -8 এ এনকোডযুক্ত জেএসওএন পাঠ্যগুলি এই অর্থে আন্তঃযোগাযোগ্য হয় সর্বাধিক সংখ্যক বাস্তবায়নের মাধ্যমে সাফল্যের সাথে পড়ুন; এমন অনেকগুলি বাস্তবায়ন রয়েছে যা অন্যান্য এনকোডিংগুলিতে (যেমন ইউটিএফ -16 এবং ইউটিএফ -32) সফলভাবে পাঠগুলি পড়তে পারে না Imp বাস্তবায়ন জেএসওএন পাঠ্যের শুরুর দিকে একটি বাইট অর্ডার চিহ্ন যুক্ত করতে হবে না। "
থোমাসরুটটার

পছন্দ করুন বর্তমান বৈশিষ্ট বলছে: " তাদেরকে JSON টেক্সট সিস্টেমগুলি একটি বদ্ধ বাস্তু হল UTF-8 ব্যবহার এনকোড করা আবশ্যক অংশ নয় মধ্যে বিনিময় যখন তাদেরকে JSON টেক্সট প্রেরণ তাদেরকে JSON পূর্ববর্তী নির্দিষ্টকরণের হল UTF-8 ব্যবহার প্রয়োজন হয় না আছে তবে বেশীরভাগ।। JSON- ভিত্তিক সফ্টওয়্যার বাস্তবায়নগুলি ইউটিএফ -8 এনকোডিংটি ব্যবহার করতে বেছে নিয়েছে, কেবলমাত্র আন্তঃব্যবহারযোগ্যতা অর্জনকারী এটিই এনকোডিং Imp বাস্তবায়নগুলি নেটওয়্যার্ক-ট্রান্সমিশনের শুরুতে বাইট অর্ডার চিহ্ন (U + FEFF) যুক্ত করা উচিত নয় জেএসএন পাঠ্য
রেমি লিবিউ

12

এএসসিআইআই এটিতে আর নেই। ইউটিএফ -8 এনকোডিং ব্যবহারের অর্থ আপনি ASCII এনকোডিং ব্যবহার করছেন না। আরএফসি যা বলেছে তার জন্য আপনার পালানোর ব্যবস্থাটি ব্যবহার করা উচিত:

সমস্ত ইউনিকোড অক্ষর উদ্ধৃতি চিহ্নের মধ্যে রেখে দেওয়া হতে পারে এমন অক্ষর ব্যতীত যেগুলি পালাতে হবে: উদ্ধৃতি চিহ্ন, বিপরীত ঘনত্ব এবং নিয়ন্ত্রণ অক্ষর (U + 0000 U + 001F এর মাধ্যমে)


4
আপনি যে প্রদত্ত উদ্ধৃতিটি পড়েছেন তা যদি আপনি দেখতে পান যে আপনাকে সমস্ত ইউনিকোড অক্ষর, কেবলমাত্র কয়েকটি বিশেষ অক্ষর থেকে রক্ষা পাওয়ার দরকার নেই। তবে আপনাকে ফলাফলগুলি এনকোড করতে হবে (পছন্দসই utf-8 সহ)। সুতরাং প্রশ্নটি হ'ল: "আপনি যদি ইউটিএফ -8 এনকোডিং করে থাকেন তবে সাধারণ ইউনিকোড অক্ষরগুলি এড়িয়ে যাওয়া কেন বিরক্ত করবেন"।
স্কিচবি

এছাড়াও, একটি এসকিআই এনকোড স্ট্রিং হল utf-8 এর খাঁটি উপসেট। আমি যদি সমস্ত অ-এসকিআই চরিত্রের জন্য জেসন এর পলায়ন ব্যবহার করি তবে ফলাফলটি আসকি - এবং অতএব utf-8। বিভিন্ন জসন লাইব্রেরিতে (পাইথন সিম্পজসনের মতো) আসকি ফলাফল জোর করার পদ্ধতি রয়েছে। আমি মনে করি ব্রাউজারগুলিতে সম্ভবত মৃত্যুদন্ড কার্যকর করার মতো কোনও কারণে।
স্কিচবি

আপনি যখন সাধারণ ইউনিকোড অক্ষরগুলি এড়িয়ে চলা বিরক্ত করবেন তখন সেগুলি স্ট্রকের মতো মেটাচার্যাক্টর প্রসঙ্গে থাকে। (আমি উদ্ধৃত আরএফসি অংশটি স্ট্রিং সম্পর্কিত; দুঃখিত, এটি সম্পর্কে পরিষ্কার ছিল না)) আপনাকে এএসসিআইআই আউটপুট সবসময় করার দরকার নেই; আমি ভাবি এটি ভাঙ্গা ব্রাউজারগুলির সাথে ডিবাগ করার জন্য আরও বেশি।
বিশৃঙ্খলা

7

আমিও একই সমস্যায় পড়ছিলাম। এটা আমার জন্য কাজ করে. অনুগ্রহপূর্বক এটি যাচাই করুন.

json_encode($array,JSON_UNESCAPED_UNICODE);

এটি উল্লিখিত হওয়া উচিত যে উপরের পিএইচপি, যেহেতু প্রশ্নটি
কোনওভাবেই

1

Json rfc ( http://www.ietf.org/rfc/rfc4627.txt ) পড়লে এটি স্পষ্ট যে পছন্দসই এনকোডিংটি utf-8।

এফওয়াইআই, আরএফসি 4627 আর আর অফিসিয়াল জেএসএন স্পেক নয়। এটি 2014 সালে আরএফসি 7159 দ্বারা অচল করা হয়েছিল, যা পরে আরএফসি 8259 দ্বারা 2017 সালে অচল করা হয়েছিল , এটি বর্তমান অনুমান।

আরএফসি 8259 বলেছেন:

8.1। অক্ষর এনকোডিং

জেএসওএন পাঠ্য এমন ব্যবস্থাগুলির মধ্যে বিনিময় হয়েছে যা বন্ধ ইকোসিস্টেমের অংশ নয় না ইউটিএফ -8 ব্যবহার করে এনকোড করা উচিত [আরএফসি 3629]

জেএসএন এর পূর্বের স্পেসিফিকেশনগুলিতে জেএসএন পাঠ্য প্রেরণ করার সময় ইউটিএফ -8 ব্যবহারের প্রয়োজন নেই। তবে, JSON ভিত্তিক সফ্টওয়্যার বাস্তবায়নের সিংহভাগ ইউটিএফ -8 এনকোডিংটি ব্যবহার করতে বেছে নিয়েছে, এটি কেবল আন্তঃআকক্ষীয়তা অর্জনকারী একমাত্র এনকোডিং।

বাস্তবায়নগুলি কোনও নেটওয়ার্ক-সংক্রমণিত JSON পাঠ্যের শুরুতে একটি বাইট অর্ডার চিহ্ন (U + FEFF) যুক্ত করা উচিত নয়। আন্তঃব্যবহারের স্বার্থে, জেএসওএন পাঠ্যকে বিশ্লেষণকারী প্রয়োগগুলি এটিকে ত্রুটি হিসাবে বিবেচনা করার পরিবর্তে বাইট অর্ডার চিহ্নের উপস্থিতি উপেক্ষা করে।


0

É চরের সাথে আমারও একই রকম সমস্যা ছিল ... আমি মনে করি "আপনি সম্ভবত যে পাঠ্যটি এটি খাওয়াচ্ছেন এটি ইউটিএফ -8 নয়" মন্তব্যটি সম্ভবত এখানে চিহ্নের খুব কাছাকাছি। আমার অনুভূতি আছে যে আমি উদাহরণস্বরূপ ডিফল্ট কোলেশনটি অন্য কিছু ছিলাম যতক্ষণ না বুঝে এবং utf8 এ পরিবর্তন করেছি ... সমস্যাটি হ'ল ডেটাটি ইতিমধ্যে ছিল, তাই এটি নিশ্চিত না যে এটি ডেটা রূপান্তরিত করেছে বা না যখন আমি এটি পরিবর্তন করেছি, মাইএসকিএলে সূক্ষ্ম প্রদর্শন করে ওয়ার্কবেঞ্চ শেষ ফলাফলটি হ'ল পিএইচপি কোনও তথ্য জসোনে এনকোড করবে না, কেবল মিথ্যা ফিরিয়ে দেবে। সার্ভার হিসাবে আপনি যে ব্রাউজারটি ব্যবহার করছেন তা আমার সমস্যার কারণ নয়, পিএইচপি এই চরটি উপস্থিত থাকলে utf8 তে ডেটা পার্স করবে না। যেমন আমি নিশ্চিত না যে এটি ডেটা উপস্থিত থাকার পরে স্কিমাটি ইউটিএফ 8 তে রূপান্তর করার কারণে হয়েছে বা কেবল একটি পিএইচপি বাগ is এই ক্ষেত্রে ব্যবহার করুনjson_encode(utf8_encode($string));

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