চরসেটের নামগুলি কেন ধ্রুবক নয়?


211

চরসেট সংক্রান্ত সমস্যাগুলি নিজেরাই বিভ্রান্তিকর এবং জটিল, তবে এর উপরে আপনাকে আপনার অক্ষরগুলির সঠিক নামগুলি মনে রাখতে হবে। এটা কি "utf8"? নাকি "utf-8"? নাকি "UTF-8"? কোড স্যাম্পলগুলির জন্য ইন্টারনেট অনুসন্ধান করার সময় আপনি উপরের সমস্তটি দেখতে পাবেন। কেন কেবল তাদের নামকরণ করা কনস্ট্যান্ট তৈরি এবং ব্যবহার করবেন না Charset.UTF8?


19
+1: এটিও সর্বদা আমাকে বাগড করে। একই গল্পটি এগিয়ে যায় MessageDigest#getInstance()
বালুসসি

2
আসল উত্তরের জন্য আপনাকে সূর্যের কাউকে জিজ্ঞাসা করতে হবে। এর সাথে শুভকামনা :-)
স্টিফেন সি

1
স্টিফেন সি: আমি বিশ্বাস করি এটি একটি পাবলিক মেলিং তালিকায় আলোচনা করা হয়েছে। -সোনোনে সূর্য।
টম হাটিন -

উত্তর:


160

জিজ্ঞাসা করা প্রশ্নের সহজ উত্তর হ'ল উপলভ্য চরসেট স্ট্রিংগুলি প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের পরিবর্তিত হয়।

তবে, এখানে উপস্থিত থাকতে হবে এমন ছয়টি রয়েছে, সুতরাং ধ্রুবকগুলি অনেক আগে তাদের জন্য তৈরি করা যেতে পারে। কেন হয় নি জানি না।

জেডিকে 1.4 চারসেট প্রকারটি প্রবর্তন করে দুর্দান্ত কাজ করেছে। এই মুহুর্তে, তারা আর স্ট্রিং কনস্ট্যান্ট সরবরাহ করতে চাইত না, যেহেতু লক্ষ্যটি হল চার্সেটের উদাহরণগুলি ব্যবহার করে সবাইকে পাওয়া get তাহলে ছয়টি স্ট্যান্ডার্ড চরসেট কনস্ট্যান্ট কেন সরবরাহ করবেন না? আমি মার্টিন বুখহলজকে জিজ্ঞাসা করেছি যেহেতু তিনি আমার পাশে বসে আছেন, এবং তিনি বলেছিলেন যে সত্যিকার অর্থে কোনও দুর্দান্ত কারণ নেই, সেই সময়গুলি ছাড়া, জিনিসগুলি এখনও অর্ধ-বেকড ছিল - খুব কম জেডিকে এপিআইগুলি পুনঃনির্মাণ করা হয়েছিল চরসেট গ্রহণ করুন এবং যেগুলি ছিল তার মধ্যে চারসেট ওভারলোডগুলি সাধারণত কিছুটা খারাপ ঘটে performed

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

দীর্ঘ গল্প সংক্ষিপ্ত - কেবল আপনার নিজের ধ্রুবকগুলি সংজ্ঞায়িত করুন, বা পেনি চরসেট ক্লাস ব্যবহার করুন যা টনি পোনি লিঙ্ক করেছেন (যদিও সেই লাইব্রেরিটি আসলেই প্রকাশিত হয়নি)।

আপডেট: একটি StandardCharsetsক্লাস JDK 7 এ রয়েছে।


শুধু কৌতূহল, পেয়ারা মুক্তির (আলফা / বিটা / যাই হোক না কেন) কোন ধারণা থাকবে? প্রকল্পের হোমপেজ এটিতে কিছুটা কম।
জোনিক

আমার জন্য কোনও টার্কি না হওয়া পর্যন্ত!
কেভিন বোউরিলিয়ন

কারণ অবিশ্বাস্যরূপে অদ্ভুত এবং আমি এটি ব্যাখ্যা করতে পারি না, তবে এটি সুরক্ষা সম্পর্কিত - আপনি কাস্টম চার্সেটের মাধ্যমে একটি পরিবর্তনযোগ্য স্ট্রিং তৈরি করতে পারেন, তবুও সেগুলি স্ট্রিংয়ের চেয়েও দ্রুত কাজ করা যেতে পারে (যা আসলে অক্ষরটিকে দেখায়)। এটি কীভাবে String(byte bytes[], int offset, int length, Charset charset)কার্যকর হয় তা একটি ভুল / অবহেলা । আসলে, বড় বাইট [] থেকে একটি ছোট স্ট্রিং তৈরি করার সময় পারফরম্যান্স হিট মোটেও তুচ্ছ নয়।
16-25

7
ফর্সা নেই! আপনি যেমন দুর্দান্ত উত্স অ্যাক্সেস আছে। = (আমি আর একটি উত্তর দেখেছি যেখানে আপনি একবার বলেছিলেন, "হ্যাঁ, তাই আমি জোশকে [
ব্লচকে

প্রিন্টস্ট্রিম চারসেটকে সমর্থন করে না
রোফরোল

102

দুই বছর পরে, এবং জাভা 7 এর স্ট্যান্ডার্ডচরেটস এখন 6 স্ট্যান্ডার্ড অক্ষরগুলির জন্য ধ্রুবককে সংজ্ঞায়িত করে।

আপনি যদি জাভা 5/6 এ আটকে থাকেন তবে আপনি পেয়ারা চরসেটের ধ্রুবক ব্যবহার করতে পারেন , যেমন কেভিন বোউরিলিয়ন এবং জন স্কিটির পরামর্শ অনুসারে।


29

আমি যুক্তি দিয়ে বলছি যে আমরা এর চেয়ে আরও ভাল কিছু করতে পারি ... গ্যারান্টিযুক্ত-হতে-পাওয়া যায় এমন অক্ষরগুলি কেন সরাসরি অ্যাক্সেসযোগ্য নয়? স্ট্রিং হিসাবে নাম নয়, Charset.UTF8একটি রেফারেন্স হওয়া উচিত Charset। এইভাবে আমাদের UnsupportedEncodingExceptionপুরো জায়গা জুড়ে পরিচালনা করতে হবে না ।

মনে মনে, আমিও মনে করি .NET সর্বত্র ইউটিএফ -8 এ ডিফল্ট করে একটি আরও ভাল কৌশল বেছে নিয়েছে। এটা তোলে তারপর "অপারেটিং সিস্টেম ডিফল্ট" নামকরণের দ্বারা আপ মাতাল কেবল সম্পত্তি এনকোডিং Encoding.Default- যা নয় .NET নিজেই মধ্যে ডিফল্ট :(

জাভা চরসেট সমর্থন সম্পর্কে ভাড়ায় ফিরে - কেন FileWriter/ কেন FileReaderলাগে এমন কোনও কনস্ট্রাক্টর নেই Charset? মূলত সেগুলি এই বিধিনিষেধের কারণে প্রায় অকেজো ক্লাস - আপনার প্রায় সবসময় আউটপুটের জন্য InputStreamReaderপ্রায় একটি FileInputStreamবা সমমানের প্রয়োজন হয় :(

নার্স, নার্স - আমার ওষুধ কোথায়?

সম্পাদনা: এটি আমার কাছে ঘটে যে এটি সত্যই প্রশ্নের উত্তর দেয় নি। আসল উত্তরটি সম্ভবতঃ "এটি সম্পর্কে কেউ ভাবেনি" বা "কেউ জড়িত বলে মনে হয়েছিল এটি একটি খারাপ ধারণা was" আমি দৃ strongly়ভাবে পরামর্শ দেব যে নাম বা চরসেট সরবরাহকারী ইন-হাউস ইউটিলিটি ক্লাসগুলি কোডবেসের চারপাশে সদৃশতা এড়ায় ... অথবা এই উত্তরটি প্রথম যখন লেখা হয়েছিল তখন আপনি গুগলে আমরা যেটি ব্যবহার করেছি সেগুলি আপনি কেবল ব্যবহার করতে পারেন । (নোট করুন জাভা 7 হিসাবে, আপনি কেবল StandardCharsetsপরিবর্তে ব্যবহার করতে চাই ))


2
+1 টি। তবে ক্ষেত্রের পরিবর্তে একটি পদ্ধতি হিসাবে যাতে অলস লোডিংয়ের অনুমতি দেওয়া হয় (ঠিক আছে, আপনি সম্ভবত ইউটিএফ -8 চাইছেন, তবে কয়েকটি অন্যান্য অক্ষর রয়েছে এবং আপনি তাদের জন্য অনুরূপ সুবিধাদি চাইবেন)। দুর্ভাগ্যক্রমে সিদ্ধান্তগুলি নেওয়ার ক্ষেত্রে এটি খুব জনপ্রিয় বলে মনে হয় না।
টম হাটিন -

আমি একটি পদ্ধতিতে যথেষ্ট খুশি হব, যদিও আমি আশা করি যে খুব কম কয়েকটি চরসেটটি আগ্রহীভাবে লোড করা কোনও উল্লেখযোগ্য ব্যয় হবে না।
জন স্কিটি

1
উত্সাহী শ্রেণি লোডিং বন্ধ করার জন্য আমরা ক্রুসেডে আছি। / সবে "ইউটিএফ -8" এর জন্য একটি জেডিকে অনুসন্ধান করেছিলেন। 165 ফাইল (গুলি) এ 270 ম্যাচ (এস) পাওয়া গেছে। যদিও এর অনেক কিছুই পুরানো আপাচে আবর্জনায় রয়েছে (আমি বিশ্বাস করি যে আমার দল দ্বারা অবদান রয়েছে)।
টম হাটিন -

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

পেয়ারা চার্সেটের শেষ লিঙ্কটি ভেঙে গেছে।
লার্শ

28

জাভাতে 1.7

import java.nio.charset.StandardCharsets

উদা: StandardCharsets.UTF_8 StandardCharsets.US_ASCII


5

এনকোডিং এপিআই-এর বর্তমান অবস্থাটি কাঙ্ক্ষিত হতে কিছু ফেলেছে। জাভা 6 API- এর কিছু অংশ গ্রহন করি না Charsetএকটি স্ট্রিং স্থানে (ইন logging, dom.ls, PrintStream, সেখানে অন্যদের হতে পারে)। এটি এনকোডিংগুলিকে স্ট্যান্ডার্ড লাইব্রেরির বিভিন্ন অংশের জন্য আলাদা ক্যানোনিকাল নাম থাকার কথা বলে সাহায্য করে না।

আমি বুঝতে পারি কীভাবে জিনিসগুলি তারা কোথায় রয়েছে; এগুলি কীভাবে ঠিক করা যায় সে সম্পর্কে আমার কোনও উজ্জ্বল ধারণা আছে তা নিশ্চিত নই।


একপাশে ...

আপনি এখানে সনের জাভা 6 বাস্তবায়নের জন্য নামগুলি সন্ধান করতে পারেন ।

হল UTF-8 জন্য, ক্যানোনিকাল মান "UTF-8"জন্য java.nioএবং "UTF8"জন্য java.langএবং java.io। কেবলমাত্র এনকোডিংগুলিকেই অনুমানের জন্য একটি জেআরই প্রয়োজন: ইউএস-এএসসিআইআই; ISO-8859-1-; হল UTF-8; হল UTF-16BE; হল UTF-16LE; ইউটিএফ -16


2
আমি প্রিন্টস্ট্রিমটি একের কাছে প্রার্থনা করি না, কারণ ক্লাসটি পরিষ্কারভাবে বলেছে যে "প্রিন্ট রাইটার ক্লাস এমন পরিস্থিতিতে ব্যবহার করা উচিত যেখানে বাইটের চেয়ে অক্ষরের লেখার প্রয়োজন হয়।" (যা হ'ল, সমস্ত পরিস্থিতিতে ...)
কেভিন বোউরিলিয়ন

2

আমি অনেক আগে ইউটিএফ_ 8, আইএসও_8859_1 এবং ইউএস_এএসসিআইআই চারসেট কনস্ট্যান্ট সহ একটি ইউটিলিটি ক্লাস সংজ্ঞায়িত করেছি।

এছাড়াও, কিছু দীর্ঘ সময় আগে (2+ বছর) আমি মধ্যে একটি সহজ কর্মক্ষমতা পরীক্ষা করেনি new String( byte[], Charset )এবং new String( byte[], String charset_name )এবং আবিষ্কৃত হয় যে আধুনিক বাস্তবায়ন যথেষ্ট দ্রুত। আপনি যদি সোর্স কোডের ফণার নীচে একবার লক্ষ্য করেন তবে দেখবেন যে তারা সত্যই বেশ কিছু ভিন্ন পথ অনুসরণ করে।

সেই কারণেই আমি একটি ক্লাসে একটি ইউটিলিটি অন্তর্ভুক্ত করেছি

public static String stringFromByteArray (
    final byte[] array,
    final Charset charset
)
{
    try
    {
        return new String( array, charset.name( ) )
    }
    catch ( UnsupportedEncodingException ex )
    {
        // cannot happen
    }
}

স্ট্রিং (বাইট [], চরসেট) কনস্ট্রাক্টর কেন একই কাজ করে না, আমাকে মারধর করে।


1
Charsetপ্রয়োজন নেই, নিবন্ধন করা না, তাই ব্যতিক্রম ঘটতে পারে। আইআইআরসি, জ্ঞাত-ভাল Charsetবাস্তবায়নের জন্য এটি দ্রুত করার জন্য জেডিকে 7-তে কিছু পরিবর্তন হয়েছে (অতিরিক্ত অনুলিপি মুছে ফেলুন )।
টম হাটিন -
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.