"বিষয়বস্তুর ধরণ: অ্যাপ্লিকেশন / জেসন" কী করে? চরসেট = utf-8 "এর অর্থ আসলে?


284

আমি যখন আমার আরএসইটি সার্ভিসে কোনও জেএসওএন বডি সহ একটি পোষ্ট অনুরোধ করি তখন আমি Content-type: application/json; charset=utf-8বার্তা শিরোনামে অন্তর্ভুক্ত করি । এই শিরোলেখ ছাড়াই, আমি পরিষেবা থেকে একটি ত্রুটি পেয়েছি। আমি অংশ Content-type: application/jsonছাড়া সফলভাবে ব্যবহার করতে পারেন ;charset=utf-8

ঠিক charset=utf-8কি করে? আমি জানি এটি অক্ষর এনকোডিং নির্দিষ্ট করে তবে পরিষেবাটি এটি ব্যতীত দুর্দান্ত কাজ করে। এই এনকোডিংটি কী বার্তাগুলির মূল অক্ষরে অক্ষরে রয়েছে?



8
Intriguingly অনুযায়ী IANA এর application/jsonমিডিয়া প্রকার রেজিস্ট্রেশন , একটি সমর্থিত হতে বলে মনে হচ্ছে না charsetযদিও প্রায়ই বাস্তবে সরবরাহকৃত হচ্ছে, এ সব প্যারামিটার।
Uux

1
I know it specifies the character encoding but the service works fine without it."কাজ করা" এর অর্থ সর্বদা এই নয় যে "বিদ্যমান কোনও কোড / কনফিগারেশন হ'ল একটি জিনিস করার জন্য সমস্ত কোণার ক্ষেত্রে আবরণ most" এটি সমস্ত সম্মেলন এবং অনুমানের উপর নির্ভর করে যা অন্যান্য পরিস্থিতিতে কাজ না করে। ব্যক্তিগতভাবে আমার জন্য, আমি সর্বদা যথাসম্ভব সুস্পষ্ট হওয়ার চেষ্টা করি।
ওয়েস্টার্নগুন

3
একটি "চারসেট" পরামিতি প্রেরণ করা ভুল এবং অর্থহীন। আরএফসি 8259, বিভাগ 11, শেষ বাক্য দেখুন।
জুলিয়ান রেসচে

উত্তর:


283

শিরোনামটি কেবলমাত্র সামগ্রীটি কীভাবে এনকোড করা হয়েছে তা বোঝায় the বিষয়বস্তু থেকে নিজেই সামগ্রীর ধরণটি নির্ধারণ করা সম্ভব নয়, অর্থাত্ আপনি প্রয়োজনীয়ভাবে কেবল সামগ্রীটি দেখতে এবং এটি দিয়ে কী করবেন তা জানতে পারবেন না। এইচটিটিপি শিরোনামের জন্য এটিই, তারা প্রাপককে জানায় যে তারা কী ধরণের বিষয়বস্তু নিয়েছে (ধারণা করা যায়)।

Content-type: application/json; charset=utf-8UTF-8 অক্ষর এনকোডিং-এ এনকোডযুক্ত, JSON ফর্ম্যাটে থাকা সামগ্রীটি ডিজাইন করে। জেএসএনের জন্য এনকোডিংটি নির্ধারণ করা কিছুটা বাড়াবাড়ি, যেহেতু জেএসএনের জন্য ডিফল্ট (কেবল?) এনকোডিংটি ইউটিএফ -8 হয়। সুতরাং এক্ষেত্রে প্রাপক সার্ভারটি জেএসওনের সাথে কাজ করে এবং এটি এনকোডিংটি ডিফল্টরূপে ইউটিএফ -8 হ'ল এটি হ্যাডারের সাথে বা ছাড়াই কাজ করে তা জেনে খুশি।

এই এনকোডিংটি কী বার্তাগুলির মূল অক্ষরে অক্ষরে রয়েছে?

না। আপনি শিরোনাম এবং শরীরে যা খুশি তাই পাঠাতে পারেন। তবে, যদি দুজনের মিল না হয় তবে আপনি ভুল ফলাফল পেতে পারেন। যদি আপনি শিরোনামে উল্লেখ করেন যে সামগ্রীটি ইউটিএফ -8 এনকোডযুক্ত তবে আপনি ল্যাটিন 1 এনকোডযুক্ত সামগ্রীটি প্রেরণ করছেন তবে রিসিভারটি জঞ্জাল ডেটা তৈরি করতে পারে, ল্যাটিন 1 এনকোডড ডেটা ইউটিএফ -8 হিসাবে ব্যাখ্যা করার চেষ্টা করে। অবশ্যই যদি আপনি উল্লেখ করেন যে আপনি লাতিন 1 এনকোডড ডেটা প্রেরণ করছেন এবং আপনি আসলে এটি করছেন, তবে হ্যাঁ, আপনি ল্যাটিন 1 এ এনকোড করতে পারবেন এমন 256 টি অক্ষরের মধ্যে সীমাবদ্ধ।


4
অবশ্যই, জেএসএন-তে আপনি এখনও অব্যাহতি সিক্যুয়েন্সগুলি ব্যবহার করে ল্যাটিন-অ-অক্ষরগুলি উপস্থাপন করতে পারেন \u20AC
dan04

31
জসনের মান অনুসারে, সামগ্রীগুলির এনকোডিংয়ের জন্য আপনাকে ল্যাটিন 1 ব্যবহার করার অনুমতি নেই। জেএসওএন সামগ্রীটি ইউনিকোড হিসাবে এনকোড করতে হবে, তা ইউটিএফ -8, ইউটিএফ -16, বা ইউটিএফ -32 (বড় বা সামান্য এডিয়ান) হতে হবে।
ড্যানিয়েল লুনা

20
অ্যাপ্লিকেশন / জেসসনে কোনও চরসেট প্যারামিটার নেই।
জুলিয়ান রেসকে

7
@ ড্যানিয়েলুনা ঠিক আছে, ইউসিএস application/jsonরূপান্তর ফর্ম্যাটগুলির মধ্যে একটিতে থাকতে হবে। এছাড়াও, যেহেতু JSON এর প্রথম চারটি বাইটস সীমিত, আপনি সর্বদা এটি 8, 16 বা 32 এবং এর এরিয়ান-নেস কিনা তা বলতে পারবেন ।
জেসন কোকো

4
ইভেন্ট যদি এটি অপ্রয়োজনীয় হয় তবে আপনি charset=utf-8সুরক্ষার কারণে এইগুলি
manuc66

143

@ জালিয়াতির দাবী প্রমাণ করতে ডিফল্ট জেএসএন এনকোডিংটি ইউটিএফ -8 ...

আইইটিএফ আরএফসি 4627 থেকে :

JSON পাঠ্যটি ইউনিকোডে এনকোড করা উচিত। ডিফল্ট এনকোডিংটি ইউটিএফ -8।

যেহেতু কোনও জেএসএন পাঠ্যের প্রথম দুটি অক্ষর সবসময়ই ASCII অক্ষর হবে [আরএফসি 10020], এটি নির্ধারণ করা সম্ভব যে একটি অক্টেট স্ট্রিমটি ইউটিএফ -8, ইউটিএফ -16 (বিই বা এলই), বা ইউটিএফ -32 (বিই বা লে) প্রথম চারটি অক্টেটে নালগুলির ধরণটি দেখে।

      00 00 00 xx  UTF-32BE
      00 xx 00 xx  UTF-16BE
      xx 00 00 00  UTF-32LE
      xx 00 xx 00  UTF-16LE
      xx xx xx xx  UTF-8

12
এটি সর্বদা জেএসএনকে বাইনারি ফর্ম্যাট হিসাবে না, পাঠ্য বিন্যাস হিসাবে ভাবতে সহায়তা করে।
সুলতান

2
এখন যেহেতু আরএফসি 4627 আরএফসি 7159 দ্বারা অচল হয়ে গেছে, যা বলে যে মূল মানটি একটি স্ট্রিং হতে পারে (পূর্বের বৈশিষ্টের সাথে সুস্পষ্ট বিপরীতে), এখন এটি কীভাবে বাস্তবায়ন হয়? এক্ষেত্রে অনুমানটি অস্পষ্ট, এবং কেবলমাত্র বলেছেন যে তিনটি এনকোডিং অনুমোদিত, তবে কীভাবে তাদের আলাদা করা উচিত বলে মনে করা হচ্ছে তা নয়।
ফ্যাবিও বেলট্রামিণী

4
@ ফ্যাবিওবেলট্রিমি উপরেরটি এখনও থাকা উচিত, কারণ জেএসএনে একটি স্ট্রিংতে কোনও আক্ষরিক নাল অক্ষর থাকবে না (জেএসওনে নালগুলি একটি সংখ্যাসূচক পালানোর ক্রম সহ এনকোড করা প্রয়োজন অর্থাত "\u0000")।
thomasrutter

3
প্রকৃতপক্ষে ইউটিএফ -১xx xxx এর দ্বিতীয় চরিত্রের ক্ষেত্রে NUL নাও থাকতে পারে তবে অন্য বাইটগুলি থেকে এনকোডিং নির্ধারণ করা এখনও সম্ভব হবে: xx 00 00 00এখনও UTF-32LE এবং xx 00 xx xxএখনও ইউটিএফ -16 এলই, 00 xx xx xxএখনও ইউটিএফ -16 বিই হয়।
থোমাসরুটটার

20

মনে রাখবেন যে, IETF RFC4627 দ্বারা বাতিল করা হয়েছে IETF RFC7158 । বিভাগে [.1.১] এটি @ ড্র এর দ্বারা উদ্ধৃত টেক্সটটি পূর্বে বলেছে:

Implementations MUST NOT add a byte order mark to the beginning of a JSON text.

ধারণাটি এখনও ধরে রেখেছে, যেহেতু কোনও বৈধ জসন এখনও দু'টি এসসিআই অক্ষর দিয়ে শুরু হবে।
লার্সিং

একটি চরিত্র, কারণ একটি একক সংখ্যা একটি বৈধ JSON ফাইল
নায়ুকি

0

আমি @ ডিজিজের সাথে ঠিক একমত তবে আমি এই "পরিষেবাটি থেকে একটি ত্রুটি পেয়েছি" বিকাশ করতে চাই প্রশ্নের অংশীদার অংশটি ,

আমরা এই ধরণের ত্রুটি এইচটিসি 415 হিসাবে পাচ্ছি

এইচটিটিপি 415 অসমর্থিত মিডিয়া ধরণের ত্রুটি

এইচটিটিপি 415 অসমর্থিত মিডিয়া টাইপ ক্লায়েন্ট ত্রুটি প্রতিক্রিয়া কোড নির্দেশ করে যে সার্ভারটি অনুরোধটি মানতে অস্বীকৃতি জানায় কারণ পে-লোড ফর্ম্যাটটি একটি অসমর্থিত বিন্যাসে রয়েছে।

অনুরোধের নির্দেশিত সামগ্রী-প্রকার বা সামগ্রী-এনকোডিংয়ের কারণে ফর্ম্যাট সমস্যা হতে পারে কারণে বা সরাসরি ডেটা পরিদর্শন করার ফলে হতে পারে।

অন্য উদাহরণে যেমন https://stackoverflow.com/a/22643964/914284 এ দেখা গেছে ।

  • আমাদের সঠিক কন্টেন্টের ধরণ সেট করতে হবে এবং আমাদের দেখতে সঠিক সামগ্রী হিসাবে ধরণের বিষয়বস্তু যুক্ত করতে হবে: অ্যাপ্লিকেশন / জেসন এবং গ্রহণ: অ্যাপ্লিকেশন / জেসন। অন্যথায় এটি ডিফল্ট ধরে নিবে

0

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


0

আমি এইচটিপিপ্লাইয়েন্ট ব্যবহার করছিলাম এবং বিষয়বস্তুর ধরণের সাথে প্রতিক্রিয়া শিরোনাম পেয়েছিলাম application/json, আমি বিদেশী ভাষা বা চিহ্ন হিসাবে ইউনিকোড ব্যবহার করে এমন অক্ষর হারিয়েছি যেহেতু এইচটিটিপিপ্লাইয়েন্টটি আইএসও -8859-1-এ ডিফল্ট রয়েছে । সুতরাং, কোনও সম্ভাব্য সমস্যা এড়ানোর জন্য @ ওয়েস্টার্নগান দ্বারা উল্লিখিত হিসাবে যথাসম্ভব স্পষ্ট করে বলুন।

কোনও উপায় হ্যান্ডেল নেই যে সার্ভারের কারণে method.setRequestHeader("accept-charset", "UTF-8");আমার জন্য অনুরোধ করা-শিরোনামের চরসেট ( ) হ্যান্ডেল করে না এবং আমাকে ড্র বাইট হিসাবে প্রতিক্রিয়া ডেটা উদ্ধার করতে হয়েছিল এবং এটি ইউটিএফ -8 ব্যবহার করে স্ট্রিংয়ে রূপান্তর করতে হয়েছিল। সুতরাং, এটি সুস্পষ্ট হতে এবং ডিফল্ট মান অনুমান এড়াতে প্রস্তাবিত হয়।

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