পাঠ্য এনকোডিংয়ের সমস্যাগুলি মোকাবেলা করার কোনও সহজ উপায় কী?
পাঠ্য এনকোডিংয়ের সমস্যাগুলি মোকাবেলা করার কোনও সহজ উপায় কী?
উত্তর:
আপনি পাঠ্য এনকোডিংয়ের সমস্যাগুলি সত্যিই এড়াতে পারবেন না, তবে অ্যাপাচি কমন্সে বিদ্যমান সমাধান রয়েছে:
Reader
থেকে InputStream
:ReaderInputStream
Writer
থেকে OutputStream
:WriterOutputStream
আপনার নিজের পছন্দসই এনকোডিংটি বেছে নেওয়া দরকার।
আপনি যদি কোনও স্ট্রিং দিয়ে শুরু করেন তবে নিম্নলিখিতগুলিও করতে পারেন:
new ByteArrayInputStream(inputString.getBytes("UTF-8"))
ReaderInputStream
প্রয়োগের জন্য কম মেমরির প্রয়োজন হবে - একবারে অ্যারে সমস্ত বাইট সংরক্ষণ করার দরকার নেই।
ঠিক আছে, একটি পাঠক অক্ষরগুলি এবং একটি ইনপুট স্ট্রিম বাইটগুলি নিয়ে কাজ করে। এনকোডিংটি উল্লেখ করে যে আপনি কীভাবে আপনার অক্ষরগুলিকে বাইট হিসাবে উপস্থাপন করতে চান, সুতরাং আপনি সত্যিই বিষয়টি উপেক্ষা করতে পারবেন না। সমস্যাগুলি এড়ানোর জন্য, আমার মতামতটি: একটি চরসেট বেছে নিন (উদাঃ "ইউটিএফ -8") এবং এটির সাথে আটকে দিন।
সংক্রান্ত কিভাবে আসলে এটা করতে, যেমন নির্দিষ্ট করা হয়েছে, " এই শ্রেণীর জন্য সুস্পষ্ট নাম ReaderInputStream এবং WriterOutputStream । " আশ্চর্যজনক, " এই জাভা লাইব্রেরি অন্তর্ভুক্ত করা হয় না " যদিও 'বিপরীত' ক্লাস, InputStreamReader এবং OutputStreamWriter হয় অন্তর্ভুক্ত
সুতরাং, অ্যাপাচি কমন্স আইও সহ প্রচুর লোকেরা তাদের নিজস্ব বাস্তবায়ন নিয়ে এসেছে । লাইসেন্স সংক্রান্ত সমস্যার উপর নির্ভর করে আপনি সম্ভবত আপনার প্রকল্পে কমন্স-আইও লাইব্রেরি অন্তর্ভুক্ত করতে সক্ষম হবেন, বা উত্স কোডের একটি অংশও অনুলিপি করতে পারবেন (যা এখানে ডাউনলোডযোগ্য ) download
যেমন আপনি দেখতে পাচ্ছেন, উভয় শ্রেণির নথিতে বলা হয়েছে যে "জেআরই দ্বারা সমর্থিত সমস্ত চরসেট এনকোডিংগুলি সঠিকভাবে পরিচালনা করা হয়"।
এনবি এখানে অন্য উত্তরগুলির একটিতে একটি মন্তব্য এই বাগের উল্লেখ করেছে । কিন্তু যে অ্যাপাচি প্রভাবিত অ্যান্ট ReaderInputStream শ্রেণী ( এখানে ), না এ্যাপাচি কমন্স আই ReaderInputStream বর্গ।
আরও মনে রাখবেন যে, আপনি যদি স্ট্রিং দিয়ে শুরু করছেন, আপনি স্ট্রিংরেডার তৈরিটি এড়িয়ে যেতে পারেন এবং org.apache.commons.io.IOU কমন্স আইও এর মত একটি পদক্ষেপে ইনপুট স্ট্রিম তৈরি করতে পারেন:
InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");
অবশ্যই আপনাকে এখনও পাঠ্য এনকোডিং সম্পর্কে ভাবতে হবে তবে কমপক্ষে রূপান্তরটি এক ধাপে ঘটছে।
new ByteArrayInputStream(report.toString().getBytes("utf-8"))
, যার মধ্যে মেমোরিতে প্রতিবেদনের অতিরিক্ত দুটি অনুলিপি বরাদ্দ থাকে। রিপোর্ট বড় হলে তা খারাপ। আমার উত্তর দেখুন।
ব্যবহার:
new CharSequenceInputStream(html, StandardCharsets.UTF_8);
এই পথে String
এবং তারপরে একটি সম্মুখ রূপান্তর প্রয়োজন হয় নাbyte[]
রিপোর্টটি বড় হওয়ার ক্ষেত্রে , যা অনেক বেশি গাদা মেমরির বরাদ্দ করে। স্ট্রিংবাফার থেকে সরাসরি স্ট্রিমটি পড়ার সাথে সাথে এটি ফ্লাইতে বাইটে রূপান্তরিত হয়।
এটি অ্যাপাচি কমন্স আইও প্রকল্পের চারসেকেন্স ইনপুট স্ট্রিম ব্যবহার করে ।
এই ক্লাসগুলির সুস্পষ্ট নাম হ'ল রিডার ইনপুটস্ট্রিম এবং রাইটারআউটপুট স্ট্রিম। দুর্ভাগ্যক্রমে এগুলি জাভা লাইব্রেরিতে অন্তর্ভুক্ত নয়। তবে গুগল আপনার বন্ধু your
আমি নিশ্চিত নই যে এটি সমস্ত পাঠ্য এনকোডিং সমস্যাগুলি প্রায়শই পেতে চলেছে যা রাত্রিকালীন।
একটি আরএফই আছে, তবে এটি বন্ধ, ঠিক হবে না।
আপনি পাঠ্য এনকোডিংয়ের সমস্যাগুলি এড়াতে পারবেন না, তবে অ্যাপাচি কমন্স-আইও রয়েছে
নোটগুলি হ'ল কোডার ডটকমের পিটারের উত্তরে উল্লেখ করা লাইব্রেরিগুলি কেবল উত্স কোডের পরিবর্তে লাইব্রেরিতে লিঙ্ক রয়েছে।
আপনি যদি একটি বিষয়বস্তু লিখতে চেষ্টা করছেন Reader
একটি থেকে OutputStream
? যদি তাই হয়, আপনি একটি সহজ সময় মোড়কে থাকবে OutputStream
একটি ইন OutputStreamWriter
ও লিখতে char
থেকে গুলি Reader
করার Writer
পরিবর্তে একটি পাঠক রূপান্তর করতে চেষ্টা InputStream
:
final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block
WriterOutputStream ব্যবহার করার সময় একটি সতর্কতা - এটি কোনও ফাইলের কাছে বাইনারি ডেটা সঠিকভাবে / নিয়মিত আউটপুট স্ট্রিমের মতো হ্যান্ডেল করে না। আমার এটি নিয়ে একটি সমস্যা ছিল যা ট্র্যাক ডাউন করতে আমাকে কিছুটা সময় নিয়েছিল।
যদি আপনি পারেন তবে আমি আউটপুট স্ট্রিমটিকে আপনার বেস হিসাবে ব্যবহার করার পরামর্শ দেব এবং যদি আপনার স্ট্রিং লিখতে হয় তবে এটি করতে স্ট্রিমের চারপাশে একটি OUtputStreamWriter মোড়ক ব্যবহার করুন। আশেপাশের অন্যান্য উপাখানের তুলনায় পাঠ্যকে বাইটে রূপান্তর করা অনেক বেশি নির্ভরযোগ্য, এটি সম্ভবত রাইটারআউটপুট স্ট্রিম স্ট্যান্ডার্ড জাভা লাইব্রেরির অংশ নয়
আপনি ক্যাকটুস ব্যবহার করতে পারেন (কোনও স্থির পদ্ধতি নয়, কেবলমাত্র অবজেক্ট):
আপনি অন্যদিকেও রূপান্তর করতে পারেন: