কেন এনকোডিং.ডিফল্ট ব্যবহার করা উচিত নয় ...
@ র্যান্ডাল এর উত্তর ব্যবহার করে Encoding.Default
, তবে মাইক্রোসফ্ট এর বিরুদ্ধে সতর্কতা উত্থাপন করেছে :
বিভিন্ন কম্পিউটার ডিফল্ট হিসাবে বিভিন্ন এনকোডিং ব্যবহার করতে পারে এবং একটি কম্পিউটারে ডিফল্ট এনকোডিং পরিবর্তন করতে পারে। আপনি যদি কম্পিউটারের মধ্যে প্রবাহিত ডেটা এনকোড এবং ডিকোড করতে ডিফল্ট এনকোডিং ব্যবহার করেন বা একই কম্পিউটারে বিভিন্ন সময়ে পুনরুদ্ধার করেন তবে এটি সেই ডেটাটি ভুলভাবে অনুবাদ করতে পারে। এছাড়াও, ডিফল্ট সম্পত্তি দ্বারা ফিরে আসা এনকোডিং কোড পৃষ্ঠা দ্বারা সমর্থিত অক্ষরগুলিতে অসমর্থিত অক্ষরগুলিকে মানচিত্র করতে সেরা-ফিট ফলব্যাক ব্যবহার করে। এই কারণে, ডিফল্ট এনকোডিং ব্যবহার করার পরামর্শ দেওয়া হয় না। এনকোডেড বাইটগুলি সঠিকভাবে ডিকোড করা হয়েছে তা নিশ্চিত করতে আপনার ইউনিকোড এনকোডিং যেমন ইউটিএফ 8 এনকোডিং বা ইউনিকোড এঙ্কোডিং ব্যবহার করা উচিত। একই ফর্ম্যাটটি এনকোডিং এবং ডিকোডিংয়ের জন্য ব্যবহৃত হচ্ছে তা নিশ্চিত করতে আপনি একটি উচ্চ-স্তরের প্রোটোকলও ব্যবহার করতে পারেন।
ডিফল্ট এনকোডিংটি কী তা যাচাই করতে, ব্যবহার করুন Encoding.Default.WindowsCodePage
(আমার ক্ষেত্রে 1250 - এবং দুঃখের বিষয়, সিপি 1250 এনকোডিংয়ের কোনও পূর্বনির্ধারিত শ্রেণি নেই তবে অবজেক্টটি পুনরুদ্ধার করা যেতে পারেEncoding.GetEncoding(1250)
)।
Encoding.ASCII
7 বিট হয়, সুতরাং এটি আমার ক্ষেত্রেও কার্যকর হয় না:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... এবং এর পরিবর্তে কেন ইউটিএফ -8 এনকোডিং ব্যবহার করা উচিত ...
ডিফল্ট এনকোডিং বিভ্রান্তিমূলক:। নেট প্রকৃত ডিফল্ট হিসাবে সর্বত্র ইউটিএফ -8 ব্যবহার করে (8 বিট এনকোডিংগুলি 20 এর শেষের দিকে অচল হয়ে পড়েছে, শতাব্দী, পরীক্ষা করুন Console.OutputEncoding.EncodingName
* দেখুন) সুতরাং কোডটিতে আপনি যে ধ্রুবকটি সংজ্ঞায়িত করেছেন তা ডিফল্টরূপে ইউটিএফ -8 এনকোডড রয়েছে - তাই ডেটা উত্সটি বিভিন্ন এনকোডিং না করা থাকলে এটিকে ব্যবহার করা উচিত।
* এটি আমার ক্ষেত্রে এটি ইউটিএফ -8 যা সরাসরি মিথ্যা: chcp
উইন্ডোজ কনসোল থেকে (সেন্টিমিটার) 852 প্রদান করে - এবং এটি পরিবর্তন করা উচিত নয়, কারণ স্থানীয়করণ সিস্টেম কমান্ডগুলি (পিংয়ের মতো) এই কোডকেজটিকে হার্ডকোড করেছে
মাইক্রোসফ্টের সুপারিশ অনুসরণ করে:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
অন্যদের দ্বারা প্রস্তাবিত উদাহরণটি ইউটিএফ -8 এনকোডিং এবং এটি সরাসরি বা হিসাবে ব্যবহার করা যেতে পারে
var utf8 = Encoding.UTF8 as UTF8Encoding;
... তবে এটি সর্বদা ব্যবহৃত হয় না
বাইট অ্যারেগুলির এনকোডিংটি পশ্চিমা দেশগুলির ইউনিকোডে "কেবলমাত্র কাজ করা" উচিত, তবে আপনি আপনার প্রোগ্রামটিকে কিছুটা কম-সমর্থিত অঞ্চলে (যেমন এখানে পূর্ব ইউরোপের মতো) স্থানান্তরিত হওয়ার সাথে সাথে এটি একটি আসল গোলযোগ: চেক প্রজাতন্ত্রের উইন্ডোজ ডিফল্ট ব্যবহার করে (২০২০ সালে!) কনসোলের জন্য এমএস অ-মানক 852 (ওরফে ল্যাটিন -2), উইন্ডোজ ওএম হিসাবে 1250, ইউটিএফ -8 (65001) নতুন নেট হিসাবে ডিফল্ট এবং আমাদের মনে রাখা উচিত যে কিছু পশ্চিমা ইইউ 8 বিট ডেটা এখনও 1252-এ রয়েছে, পূর্ব পূর্ব ইউরোপের পশ্চিমা স্ট্যান্ডার্ডটি ছিল ISO-8859-2 (ওরফে ল্যাটিন -2, তবে 852-র মতো ল্যাটিন -2 নয়)। ASCII ব্যবহারের অর্থ টোফু এবং '?' এখানে. সুতরাং একবিংশ শতাব্দীর অর্ধেক অবধি ইউটিএফ -8 স্পষ্ট করে সেট করুন ।
searchResult.Properties["user"][0]
? এটিbyte[]
প্রথমে কাস্ট করার চেষ্টা করুন