ইউনিকোড অক্ষর ইউআরএল এনকোড করার সঠিক উপায় কি?


107

আমি নন-স্ট্যান্ডার্ড% ইউএক্সএক্সএক্সএক্সএক্স স্কিমটি জানি, তবে ডাব্লু 3 সি দ্বারা এই প্রকল্পটি প্রত্যাখ্যান হওয়ার পরে এটি কোনও বুদ্ধিমান পছন্দ বলে মনে হয় না।

কিছু আকর্ষণীয় উদাহরণ:

হৃদয়ের চরিত্র। যদি আমি এটি আমার ব্রাউজারে টাইপ করি:

http://www.google.com/search?q=♥

তারপরে এটি অনুলিপি করুন এবং এটি আটকে দিন I

http://www.google.com/search?q=%E2%99%A5

যা দেখে মনে হয় ফায়ারফক্স (বা সাফারি) এটি করছে।

urllib.quote_plus(x.encode("latin-1"))
'%E2%99%A5'

ট্রিপল ডট চরিত্রের মতো ল্যাটিন -১ এ এনকোড করা যায় না এমন জিনিসগুলি বাদ দিয়ে তা বোঝায়।

আমি যদি URL টি টাইপ করি

http://www.google.com/search?q=…

আমার ব্রাউজারে অনুলিপি করুন এবং পেস্ট করুন, আমি পেয়েছি

http://www.google.com/search?q=%E2%80%A6

পেছনে. যা করার ফলাফল বলে মনে হচ্ছে

urllib.quote_plus(x.encode("utf-8"))

যেহেতু তা বোঝায় ... লাতিন -১ এর সাথে এনকোড করা যায় না।

তবে তখন এটি আমার কাছে পরিষ্কার নয় যে ব্রাউজারটি কীভাবে ইউটিএফ -8 বা ল্যাটিন -1 দিয়ে ডিকোড করতে হবে তা জানে।

যেহেতু এটি অস্পষ্ট বলে মনে হচ্ছে:

In [67]: u"…".encode('utf-8').decode('latin-1')
Out[67]: u'\xc3\xa2\xc2\x80\xc2\xa6'

কাজ করে, তাই ব্রাউজারটি ইউটিএফ -8 বা ল্যাটিন -1 দিয়ে ডিকোড করতে হবে কিনা তা আমি জানি না।

আমার বিশেষ চরিত্রগুলির সাথে ডিল করার জন্য সঠিক জিনিসটি কী করা উচিত?


19
আপনার দুটি উদাহরণই ইউটিএফ -8 হিসাবে এনকোডড রয়েছে। প্রথমটি ল্যাটিন -১ নয়, প্রদত্ত যে এটি তিন বাইট দীর্ঘ ...
জাকব বোর্গ

2
ইউটিএফ -8-তে "ব্ল্যাক হার্ট স্যুট" এর বাইট মানগুলির জন্য% E2% 99% A5 হেক্স । সেই কালো হৃদয় ল্যাটিন -১ চরিত্রের সেটটির অংশ নয় ।
হক্কে পার্কার

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

উত্তর:


65

আমি সর্বদা ইউটিএফ -8 এ এনকোড করতাম। শতাংশ এনকোডিংয়ের উইকিপিডিয়া পৃষ্ঠা থেকে :

জেনেরিক ইউআরআই সিনট্যাক্স নির্দেশ দেয় যে নতুন ইউআরআই স্কিমগুলি যে কোনও ইউআরআইতে অক্ষর ডেটার উপস্থাপনের জন্য সরবরাহ করে, অবশ্যই, অনুবাদ ছাড়াই অনারक्षित সেট থেকে অক্ষরগুলি উপস্থাপন করতে হবে এবং অন্য সমস্ত অক্ষরকে ইউটিএফ -8 অনুসারে বাইটে রূপান্তর করতে হবে এবং তারপরে এই মানগুলি শতাংশ-এনকোড করুন। এই প্রয়োজনীয়তা আরএফসি 3986 এর প্রকাশের সাথে 2005 সালের জানুয়ারিতে চালু হয়েছিল । এই তারিখের আগে চালু হওয়া ইউআরআই স্কিমগুলি প্রভাবিত হবে না।

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


8
ইউটিএফ -8 ব্যবহার করা উচিত কারণ এটি কেবলমাত্র নতুন আইআরআই স্ট্যান্ডার্ড (আরএফসি 3987, সরঞ্জাম. ietf.org/html/rfc3986 ) দ্বারা অনুমোদিত একমাত্র এনকোডিং যা পুরানো ইউআরএল স্ট্যান্ডার্ডকে প্রতিস্থাপন করছে।
রেমি Lebeau

3
যদি অন্যদের মতো আমার বয়স অবাক হচ্ছ, @ RemyLebeau এর মন্তব্য পাঠ্য উল্লেখ RFC3987, যাদের কাছে লিঙ্ক পুরোনো বৈশিষ্ট 3896. সঠিক URL হয় স্পষ্টত হয় tools.ietf.org/html/rfc3987
tripleee

হ্যাঁ, দুঃখিত। ইউআরআই আরএফসি 3986 দ্বারা সংজ্ঞায়িত করা হয়েছে, আইআরআই আরএফসি 3987 দ্বারা সংজ্ঞায়িত করা হয়েছে
রেমি

10

সাধারণ নিয়মটি মনে হয় যে ব্রাউজারগুলি ফর্মটি যে পৃষ্ঠার মাধ্যমে পরিবেশন করা হয়েছিল তার সামগ্রীর ধরণ অনুযায়ী প্রতিক্রিয়াগুলিকে এনকোড দেয়। এটি একটি অনুমান যে সার্ভার যদি আমাদের "পাঠ্য / এক্সএমএল; চরসেট = আইসো -8859-1" প্রেরণ করে তবে তারা একই ফর্ম্যাটে প্রতিক্রিয়া প্রত্যাশা করবে।

আপনি যদি ইউআরএল বারে কেবল একটি URL প্রবেশ করিয়ে থাকেন তবে ব্রাউজারটিতে কাজ করার জন্য কোনও বেস পৃষ্ঠা নেই এবং তাই কেবল অনুমান করতে হবে। সুতরাং এই ক্ষেত্রে এটি সমস্ত সময় utf-8 করছে বলে মনে হচ্ছে (যেহেতু আপনার উভয় ইনপুটই তিন-অক্টেট ফর্মের মান উত্পাদন করে)।

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

এটা একটা পরিচিত সমস্যা আপনি আপনার সার্ভারে ফ্রেমওয়ার্ক যা চরিত্র আশা সেট কোয়েরি স্ট্রিং যেমন --- উদাহরণস্বরূপ, হুল বিড়াল, আপনি request.setEncoding () (অথবা কিছু অনুরূপ পদ্ধতি) ফোন করতে হবে এনকোড করা বলতে হবে যে সামনে আপনি অনুরোধ.জেটপ্যারামিটার () পদ্ধতিগুলির যে কোনওটিকে কল করুন। এই বিষয়ে নথিপত্রের অভাব সম্ভবত অনেক বিকাশকারীদের মধ্যে সমস্যা সম্পর্কে সচেতনতার অভাব প্রতিফলিত করে। (আমি নিয়মিত জাভা সাক্ষাত্কারকারীদের জিজ্ঞাসা করি যে একজন পাঠক এবং ইনপুট স্ট্রিমের মধ্যে পার্থক্য কী এবং নিয়মিত ফাঁকা চেহারা পাওয়া যায়)


6
আরএফসি 3987 (সরঞ্জাম. ietf.org/html/rfc3986 ) একটি স্ট্যান্ডার্ড এনকোডিং সংজ্ঞায়িত করেছে - ইউটিএফ -8 অবশ্যই এমন অক্ষরগুলি এনকোডিং করার সময় অবশ্যই ব্যবহার করা উচিত যা অন্যথায় আনকডবিহীন অনুমোদিত নয়।
রেমি Lebeau

8

আইআরআই ( আরএফসি 3987 ) হল সর্বশেষতম মান যা ইউআরআই / ইউআরএল ( আরএফসি 3986 এবং আরও পুরানো) মানের প্রতিস্থাপন করে । ইউআরআই / ইউআরএল স্থানীয়ভাবে ইউনিকোডকে সমর্থন করে না (ভাল, আরএফসি 3986 এটি সমর্থন করার জন্য ভবিষ্যতের ইউআরআই / ইউআরএল-ভিত্তিক প্রোটোকলগুলির বিধান যুক্ত করে তবে অতীতের আরএফসি আপডেট করে না)। "% ইউএক্সএক্সএক্সএক্সএক্স" স্কিমটি কিছু পরিস্থিতিতে ইউনিকোডকে অনুমতি দেওয়ার জন্য একটি মানহীন এক্সটেনশন, তবে সর্বজনীনভাবে প্রত্যেকে প্রয়োগ করে না। অন্যদিকে, আইআরআই সম্পূর্ণরূপে ইউনিকোডকে সমর্থন করে এবং শতাংশ-এনকোড হওয়ার আগে সেই পাঠ্যটি ইউটিএফ -8 হিসাবে এনকোড করা দরকার।


আমি প্রোটোকলগুলিতে একটি আপডেট দেখতে চাই যাতে ইউনিকোড কেবল শতাংশ-এনকোডিংয়ের মাধ্যমেই নয়, ইউআরএলগুলিতে সম্পূর্ণ সমর্থনযোগ্য।
ম্যাথিউ জে

1
আইআরআইগুলি অন-এনকোডেড ইউনিকোড অক্ষরগুলির জন্য অনুমতি দেয়, কেবলমাত্র কয়েকটি ক্ষেত্রে যেখানে সংরক্ষিত অক্ষরগুলি এনকোড করা উচিত except
রেমি Lebeau

6

আইআরআইগুলি ইউআরআইগুলি প্রতিস্থাপন করে না, কারণ শুধুমাত্র ইউআরআই (কার্যকরভাবে, এএসসিআইআই) এইচটিটিপি সহ কিছু প্রসঙ্গে অনুমোদিত।

পরিবর্তে, আপনি একটি আইআরআই নির্দিষ্ট করেন এবং তারে বেরোনোর ​​সময় এটি একটি ইউআরআইতে রূপান্তরিত হয়।


0

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

অতএব utf-8 ব্যবহার করুন যদি না আপনার কাছে অন্য অনেকগুলি এনকোডিং স্কিম ব্যবহার করার বাধ্যতামূলক কারণ থাকে।

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