সি ++ 11 এ ইউনিকোড কতটা সমর্থিত?


183

আমি শুনেছি এবং শুনেছি যে সি ++ 11 ইউনিকোড সমর্থন করে। সে সম্পর্কে কয়েকটি প্রশ্ন:

  • সি ++ স্ট্যান্ডার্ড লাইব্রেরি ইউনিকোডকে কতটা সমর্থন করে?
  • std::stringএটি করা উচিত কি না?
  • আমি কিভাবে এটা ব্যবহার করব?
  • সম্ভাব্য সমস্যাগুলি কোথায়?

19
"এসটিডি :: স্ট্রিং যা করা উচিত তা করে?" আপনি কি মনে করেন এটি করা উচিত?
আর মার্টিনহো ফার্নান্দেস

2
আমি আমার utf8 প্রয়োজনের জন্য utfcpp.sourceforge.net ব্যবহার করি। এটি একটি সাধারণ হেডার ফাইল যা ইউনিকোড স্ট্রিংয়ের জন্য পুনরাবৃত্তি সরবরাহ করে।
fscan

2
std :: স্ট্রিংয়ের বাইটগুলি সঞ্চয় করা উচিত, অর্থাৎ ইউটিএফ -8 এনকোডিংয়ের কোড ইউনিট ক্রম। হ্যাঁ, শুরু থেকেই এটি ঠিক তাই করে। utf8everywhere.org
পাভেল রাদজিভিলভস্কি

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

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

উত্তর:


267

সি ++ স্ট্যান্ডার্ড লাইব্রেরি ইউনিকোডকে কতটা ভাল সমর্থন করে?

ভয়ঙ্কর।

ইউনিকোড সমর্থন সরবরাহ করতে পারে এমন লাইব্রেরি সুবিধাগুলির মাধ্যমে একটি দ্রুত স্ক্যান আমাকে এই তালিকাটি দেয়:

  • স্ট্রিংস লাইব্রেরি
  • স্থানীয়করণ গ্রন্থাগার
  • ইনপুট / আউটপুট লাইব্রেরি
  • নিয়মিত অভিব্যক্তি গ্রন্থাগার

আমি মনে করি প্রথমটি বাদে সবগুলিই ভয়ানক সমর্থন সরবরাহ করে। আপনার অন্যান্য প্রশ্নের মাধ্যমে দ্রুত ঘুরে দেখার পরে আমি আরও বিশদে এটিতে ফিরে আসব।

std::stringএটি করা উচিত কি না?

হ্যাঁ. সি ++ স্ট্যান্ডার্ড অনুসারে, এটি std::stringএবং এর ভাইবোনদের কি করা উচিত:

শ্রেণীর টেম্পলেটটি basic_stringএমন বস্তুগুলিকে বর্ণনা করে যা শূন্যের পজিশনের প্রথম উপাদানটির সাথে বিবিধ সংখ্যক স্বেচ্ছাসেবী চর-জাতীয় বস্তু সমন্বিত একটি ক্রম সংরক্ষণ করতে পারে।

ঠিক আছে, std::stringএটা ঠিক আছে। এটি কি কোনও ইউনিকোড-নির্দিষ্ট কার্যকারিতা সরবরাহ করে? না।

ইহা উচিত? সম্ভবত না. অবজেক্টের std::stringক্রম হিসাবে ঠিক আছে char। এটি দরকারী; একমাত্র বিরক্তি হ'ল এটি পাঠ্যের খুব নিম্ন-স্তরের মতামত এবং স্ট্যান্ডার্ড সি ++ একটি উচ্চ স্তরের কোনও সরবরাহ করে না।

আমি কিভাবে এটা ব্যবহার করব?

এটি charবস্তুর ক্রম হিসাবে ব্যবহার করুন ; এটি ভান করে অন্য কিছু ব্যথা শেষ হতে বাধ্য।

সম্ভাব্য সমস্যাগুলি কোথায়?

সব জায়গায় বেশি? দেখা যাক...

স্ট্রিংস লাইব্রেরি

স্ট্রিং লাইব্রেরি আমাদের সরবরাহ করে basic_string, যা কেবলমাত্র স্ট্যান্ডার্ডকে "চর-জাতীয় বস্তু" বলে ডাকে তার ক্রম। আমি তাদের কোড ইউনিট বলি। আপনি যদি পাঠ্যের একটি উচ্চ-স্তরের দৃষ্টিভঙ্গি চান তবে এটি আপনি যা খুঁজছেন তা নয়। এটি সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন / স্টোরেজ জন্য উপযুক্ত পাঠ্যের একটি দর্শন।

এটি সি লাইব্রেরি থেকে কিছু সরঞ্জাম সরবরাহ করে যা সংকীর্ণ বিশ্ব এবং ইউনিকোড বিশ্বের মধ্যে ব্যবধানটি সরাতে ব্যবহৃত হতে পারে: c16rtomb/ mbrtoc16এবং c32rtomb/ mbrtoc32

স্থানীয়করণ গ্রন্থাগার

স্থানীয়করণ গ্রন্থাগার এখনও বিশ্বাস করে যে এই "চর-সদৃশ বস্তুগুলির মধ্যে একটির" "চরিত্র" সমান। এটি অবশ্যই নির্বোধ এবং এএসসিআইআই এর মতো ইউনিকোডের কিছু ছোট উপসেটের বাইরেও প্রচুর জিনিস সঠিকভাবে কাজ করা অসম্ভব করে তোলে।

উদাহরণস্বরূপ, শিরোনামটিতে স্ট্যান্ডার্ডটি "সুবিধাযুক্ত ইন্টারফেসগুলি" কী বলে বিবেচনা করুন <locale>:

template <class charT> bool isspace (charT c, const locale& loc);
template <class charT> bool isprint (charT c, const locale& loc);
template <class charT> bool iscntrl (charT c, const locale& loc);
// ...
template <class charT> charT toupper(charT c, const locale& loc);
template <class charT> charT tolower(charT c, const locale& loc);
// ...

আপনি কীভাবে এই ফাংশনগুলির কোনওটির যথাযথভাবে শ্রেণিবদ্ধকরণ করবেন বলে বলুন, U + 1F34C?, হিসাবে u8"🍌"বা হিসাবে আছে u8"\U0001F34C"? এটি কখনও কাজ করার উপায় নেই, কারণ এই ফাংশনগুলি ইনপুট হিসাবে কেবল একটি কোড ইউনিট নেয়।

আপনি যদি char32_tকেবলমাত্র ব্যবহার করেন তবে এটি উপযুক্ত লোকেলের সাথে কাজ করতে পারে : U'\U0001F34C'ইউটিএফ -32-এ একটি একক কোড ইউনিট।

যাইহোক, এর অর্থ এখনও আপনি কেবল সহজ কেসিং রূপান্তরগুলি পেয়ে যান toupperএবং tolowerউদাহরণস্বরূপ, কিছু জার্মান লোকালগুলির পক্ষে এটি যথেষ্ট ভাল নয়: "SS" বড় হাতের অক্ষরগুলি "এসএস" ☦ তবে toupperকেবল একটি অক্ষর কোড ইউনিট ফিরিয়ে দিতে পারে ।

পরবর্তী, wstring_convert/ wbuffer_convertএবং স্ট্যান্ডার্ড কোড রূপান্তর দিকগুলি।

wstring_convertএকটি প্রদত্ত এনকোডিংকে অন্য প্রদত্ত এনকোডিংয়ের স্ট্রিংয়ের মধ্যে রূপান্তর করতে ব্যবহৃত হয়। এই রূপান্তরটির সাথে দুটি স্ট্রিং প্রকার জড়িত রয়েছে, যা মানককে বাইট স্ট্রিং এবং প্রশস্ত স্ট্রিং বলে। যেহেতু এই পদগুলি সত্যই বিভ্রান্তিকর, তাই আমি যথাক্রমে † এর পরিবর্তে যথাক্রমে "সিরিয়ালাইজড" এবং "ডিসরিয়ালাইজড" ব্যবহার করতে পছন্দ করি †

এর মধ্যে রূপান্তর করার জন্য এনকোডিংগুলি কোনও কোডেকট (কোনও কোড রূপান্তর ফ্যাক্ট) দ্বারা টেমপ্লেট টাইপের আর্গুমেন্ট হিসাবে পাস করার সিদ্ধান্ত নিয়েছে wstring_convert

wbuffer_convertএকটি অনুরূপ ফাংশন সম্পাদন করে তবে একটি বিস্তৃত ডিসরিয়ালাইজড স্ট্রিম বাফার হিসাবে যা বাইট সিরিয়ালাইজড স্ট্রিম বাফারে আবৃত করে। কোডেকভেট আর্গুমেন্টের দ্বারা প্রদত্ত এনকোডিংগুলিতে এবং রূপান্তরকৃত অন্তর্নিহিত বাইট সিরিয়ালাইজড স্ট্রিম বাফারের মাধ্যমে যে কোনও আই / ও করা হয় । সেই বাফারে সিরিয়ালাইজ লেখা, এবং তারপরে সেগুলি লিখুন, এবং পড়াটি বাফারে পড়ে এবং তারপরে এটি ডিসরিয়ালাইজ হয়।

মান এই সুবিধা সাথে ব্যবহারের জন্য কিছু codecvt বর্গ টেমপ্লেট প্রদান করে: codecvt_utf8, codecvt_utf16, codecvt_utf8_utf16, এবং কিছু codecvtবিশেষায়িত। একসাথে এই স্ট্যান্ডার্ড দিকগুলি নিম্নলিখিত সমস্ত রূপান্তর সরবরাহ করে। (দ্রষ্টব্য: নীচের তালিকায়, বামে এনকোডিংটি সর্বদা সিরিয়ালযুক্ত স্ট্রিং / স্ট্র্যামবুফ থাকে এবং ডানদিকে থাকা এনকোডিংটি সর্বদা ডিসরিয়ালাইজড স্ট্রিং / স্ট্র্যামবুফ থাকে; স্ট্যান্ডার্ডটি উভয় দিকে রূপান্তর করতে দেয়)।

  • ইউটিএফ -8 ↔ ইউসিএস -২ সহ codecvt_utf8<char16_t>, এবং codecvt_utf8<wchar_t>কোথায় sizeof(wchar_t) == 2;
  • হল UTF-8 ↔ সঙ্গে হল UTF-32 codecvt_utf8<char32_t>, codecvt<char32_t, char, mbstate_t>এবং codecvt_utf8<wchar_t>যেখানে sizeof(wchar_t) == 4;
  • ইউটিএফ -16 ↔ codecvt_utf16<char16_t>এবং codecvt_utf16<wchar_t>যেখানে ইউসিএস -2 sizeof(wchar_t) == 2;
  • ইউটিএফ -16 ↔ ইউটিএফ -32 সহ codecvt_utf16<char32_t>এবং codecvt_utf16<wchar_t>কোথায় sizeof(wchar_t) == 4;
  • হল UTF-8 ↔ সঙ্গে হল UTF-16 codecvt_utf8_utf16<char16_t>, codecvt<char16_t, char, mbstate_t>এবং codecvt_utf8_utf16<wchar_t>যেখানে sizeof(wchar_t) == 2;
  • সংকীর্ণ সঙ্গে প্রশস্ত codecvt<wchar_t, char_t, mbstate_t>
  • কোন বিকল্প নেই codecvt<char, char, mbstate_t>

এর মধ্যে বেশ কয়েকটি দরকারী, তবে এখানে প্রচুর বিশ্রী জিনিস রয়েছে।

প্রথমে high পবিত্র হাই সার্গেট! নামকরণ প্রকল্পটি অগোছালো।

তারপরে, অনেকগুলি ইউসিএস -2 সমর্থন রয়েছে। ইউসিএস -২ হ'ল ইউনিকোড ০.০ এর একটি এনকোডিং যা ১৯৯ 1996 সালে ছাড়ানো হয়েছিল কারণ এটি কেবলমাত্র বেসিক বহুভাষিক বিমানটিকে সমর্থন করে। কেন কমিটি 20 বছরেরও বেশি আগে যে এনকোডিংকে ছাড়িয়েছিল তা কেন মনোযোগী বলে বিবেচিত হয়েছিল, আমি জানি না ‡ এটি আরও এনকোডিংগুলির পক্ষে সমর্থন খারাপ বা কোনও কিছুর মতো নয়, তবে ইউসিএস -২ এখানে প্রায়শই দেখা যায়।

আমি বলব যে char16_tএটি স্পষ্টতই ইউটিএফ -16 কোড ইউনিট সংরক্ষণ করার জন্য। তবে এটি স্ট্যান্ডার্ডের একটি অংশ যা অন্যথায় চিন্তা করে। codecvt_utf8<char16_t>ইউটিএফ -16 এর সাথে কোনও সম্পর্ক নেই। উদাহরণস্বরূপ, wstring_convert<codecvt_utf8<char16_t>>().to_bytes(u"\U0001F34C")জরিমানা সংকলন করবে, তবে নিঃশর্তে ব্যর্থ হবে: ইনপুটটিকে ইউসিএস -2 স্ট্রিং হিসাবে বিবেচনা করা হবে u"\xD83C\xDF4C", যা ইউটিএফ -8 এ রূপান্তর করা যায় না কারণ ইউটিএফ -8 0xD800-0xDFFF পরিসরের কোনও মান এনকোড করতে পারে না।

এখনও ইউসিএস -২ এর সম্মুখভাগে, কোনও ইউটিএফ -১ by বাইট স্ট্রিম থেকে এই দিকগুলি সহ কোনও ইউটিএফ -16 স্ট্রিংয়ে পড়ার উপায় নেই। আপনার যদি ইউটিএফ -16 বাইটের ক্রম থাকে তবে আপনি এটিকে স্ট্রিং-এ ডিজিট্রাইজ করতে পারবেন না char16_t। এটি আশ্চর্যজনক, কারণ এটি কম-বেশি পরিচয় রূপান্তর। আরও আশ্চর্যজনক হলেও সত্য যে কোনও ইউটিএফ -16 স্ট্রিমের সাথে ইউসিএস -2 স্ট্রিংয়ের ডিসায়ালাইজিংয়ের সমর্থন রয়েছে codecvt_utf16<char16_t>যা আসলে একটি ক্ষতিকারক রূপান্তর।

ইউটিএফ -16-হিসাবে-বাইটস সমর্থনটি বেশ ভাল, যদিও: এটি কোনও বিওএম থেকে অন্তর্নিহিততা সনাক্তকরণ, বা কোডে এটি স্পষ্টভাবে নির্বাচন করা সমর্থন করে। এটি বিওএম এর সাথে এবং তার বাইরেও আউটপুট উত্পাদন সমর্থন করে।

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

এবং এখানে সংকীর্ণ / প্রশস্ত বিশ্ব ইউটিএফ / ইউসিএস বিশ্ব থেকে সম্পূর্ণ পৃথক। পুরানো স্টাইলের সরু / প্রশস্ত এনকোডিং এবং কোনও ইউনিকোড এনকোডিংয়ের মধ্যে কোনও রূপান্তর নেই।

ইনপুট / আউটপুট লাইব্রেরি

আই / ও লাইব্রেরিটি ইউনিকোড এনকোডিংগুলিতে উপরে বর্ণিত সুবিধাগুলি wstring_convertএবং পাঠ্যগুলি পড়তে এবং লিখতে ব্যবহার করা যেতে পারে wbuffer_convert। আমি মনে করি না যে স্ট্যান্ডার্ড লাইব্রেরির এই অংশটির দ্বারা আরও অনেক কিছু সমর্থিত হওয়া দরকার।

নিয়মিত অভিব্যক্তি গ্রন্থাগার

আমি এর আগে স্ট্যাক ওভারফ্লোতে সি ++ রিজেক্সস এবং ইউনিকোডের সমস্যাগুলি ব্যাখ্যা করেছি । আমি এখানে এই সমস্ত পয়েন্ট পুনরাবৃত্তি করব না, তবে কেবল উল্লেখ করব যে সি ++ রেজিক্সগুলির স্তরের 1 ইউনিকোড সমর্থন নেই, যা সর্বত্র ইউটিএফ -32 ব্যবহার না করে এগুলি ব্যবহারযোগ্য করে তোলার জন্য সর্বনিম্নতম।

এটাই?

হ্যাঁ, এটা। এটি বিদ্যমান কার্যকারিতা। প্রচুর ইউনিকোড কার্যকারিতা রয়েছে যা সাধারণীকরণ বা পাঠ্য বিভাজন অ্যালগরিদমের মতো কোথাও দেখা যায় না।

U + 1F4A9 । সি ++ তে আরও ভাল কিছু ইউনিকোড সমর্থন পাওয়ার উপায় আছে কি?

সাধারণ সন্দেহভাজন: আইসিইউ এবং বুস্ট.লোকালে


By একটি বাইট স্ট্রিং, আশ্চর্যজনকভাবে, বাইটগুলির একটি স্ট্রিং, অর্থাৎ, charঅবজেক্টগুলি। তবে, প্রশস্ত স্ট্রিং আক্ষরিকের তুলনায় , যা সর্বদা wchar_tঅবজেক্টগুলির একটি অ্যারে, এই প্রসঙ্গে একটি "প্রশস্ত স্ট্রিং" অবশ্যই wchar_tঅবজেক্টগুলির একটি স্ট্রিং নয় । প্রকৃতপক্ষে, স্ট্যান্ডার্ডটি কখনই "প্রশস্ত স্ট্রিং" অর্থ কী তা স্পষ্টভাবে সংজ্ঞায়িত করে না, তাই আমরা ব্যবহার থেকে অর্থটি অনুমান করতে চলেছি। যেহেতু প্রমিত পরিভাষাটি opালু এবং বিভ্রান্তিকর, তাই আমি স্বচ্ছতার নামে নিজের ব্যবহার করি।

ইউটিএফ -16 এর মতো এনকোডিংগুলি সিকোয়েন্স হিসাবে সংরক্ষণ করা যেতে পারে char16_t, যার পরে কোনও শেষ নেই; বা এগুলি বাইটের ক্রম হিসাবে সংরক্ষণ করা যেতে পারে, যার অন্তিমতা রয়েছে (প্রতিটি টানা জোড়া বাইট char16_tএন্ডিয়নেসের উপর নির্ভর করে একটি আলাদা মান উপস্থাপন করতে পারে )। মান এই উভয় ফর্মকে সমর্থন করে। একটি ক্রম char16_tপ্রোগ্রাম অভ্যন্তরীণ কারসাজি জন্য আরও দরকারী। বাইটের একটি ক্রম হ'ল বাইরের বিশ্বের সাথে এই জাতীয় স্ট্রিং বিনিময় করার উপায়। "বাইট" এবং "প্রশস্ত" এর পরিবর্তে আমি যে পদগুলি ব্যবহার করব তা এইভাবে "সিরিয়ালাইজড" এবং "ডিসিরিয়ালাইজড" হয়।

You যদি আপনি "তবে উইন্ডোজ!" বলতে চলেছেন আপনার hold রাখা । উইন্ডোজ 2000 সাল থেকে উইন্ডোজের সমস্ত সংস্করণ ইউটিএফ -16 ব্যবহার করে।

☦ হ্যাঁ, আমি গ্রোয়েস এসজেট (ẞ) সম্পর্কে জানি , তবে আপনি যদি রাতারাতি সমস্ত জার্মান লোকালকে ß বড় হাতের অক্ষরে পরিণত করতে চান তবে এখনও অন্যান্য প্রচুর ক্ষেত্রে এটি ব্যর্থ হবে। U + FB00 pp sᴍᴀʟʟ ʟɪɢᴀᴛᴜʀᴇ ғғ বড় হাতের চেষ্টা করুন ғғ এখানে ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟɪɢᴀᴛᴜʀᴇ ғғ নেই; এটি কেবলমাত্র দুটি Fs এর বড় হাতের অক্ষরে। বা U + 01F0 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴊ ᴡɪᴛʜ ᴄᴀʀᴏɴ; কোন প্রাক-মূলধন নেই; এটি কেবল একটি রাজধানী জে এবং একটি সংমিশ্রিত কারনের বড় হাতের অক্ষর।


26
আমি এই সম্পর্কে যত বেশি পড়ি, ততই আমি এই সমস্ত সম্পর্কে কোনও জিনিস না বোঝার অনুভূতি পেয়েছি। আমি বেশ কয়েক মাস আগে এই স্টাফটির বেশিরভাগ অংশ পড়েছি এবং এখনও মনে হচ্ছে যে আমি পুরো জিনিসটি আবারো আবিষ্কার করেছি ... আমার দরিদ্র মস্তিষ্কের জন্য এটি সহজ রাখার জন্য যা এখন খানিকটা ব্যথা করে, utf8 প্রতি জায়গাতে এই সমস্ত পরামর্শ এখনও কার্যকর আছে, ঠিক আছে? যদি আমি "কেবল" চাই যে আমার ব্যবহারকারীরা তাদের সিস্টেম সেটিংস নির্বিশেষে ফাইলগুলি খুলতে এবং লিখতে সক্ষম হন আমি তাদের ফাইলের নাম জিজ্ঞাসা করতে পারি, এটি একটি স্ট্যান্ড :: স্ট্রিংয়ে সঞ্চয় করতে পারি এবং উইন্ডোজেও সবকিছু ঠিকঠাকভাবে কাজ করা উচিত? এটি (আবার) জিজ্ঞাসা করার জন্য দুঃখিত ...
ইউফ্লেক্স

5
@ ইউফ্লেক্স স্ট্যান্ড :: :: স্ট্রিংয়ের মাধ্যমে আপনি যা করতে পারবেন তা হ'ল এটিকে বাইনারি ব্লব হিসাবে ধরা। ইউনিকোডের যথাযথ প্রয়োগে না অভ্যন্তরীণ (কারণ এটি বাস্তবায়নের বিশদটি গভীরভাবে লুকানো থাকে) বা বাহ্যিক এনকোডিং সংক্রান্ত বিষয়গুলি (ভাল, বাছাই, আপনার এখনও এনকোডার / ডিকোডার উপলভ্য থাকতে হবে)।
ক্যাট প্লাস প্লাস

3
@ফ্লেক্স হতে পারে। আপনি জানেন না যে নিম্নলিখিত পরামর্শগুলি ভাল ধারণা কিনা তা আমি জানি না।
আর মার্টিনহো ফার্নান্দেস

1
সি ++ 2014/17-এ ইউনিকোড সমর্থনের প্রস্তাব রয়েছে। তবে এটি 1, সম্ভবত 4 বছর দূরে এবং এখন খুব কম ব্যবহার। open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3572.html
গ্রাহাম.আরডিস

20
@ গ্রাহাম.আরডস হাহাহা, ধন্যবাদ, তবে আমি সে সম্পর্কে অবগত ছিলাম। "স্বীকৃতি" বিভাগটি দেখুন;)
আর মার্টিনহো ফার্নান্দিস

40

ইউনিকোড স্ট্যান্ডার্ড লাইব্রেরি দ্বারা সমর্থিত নয় (সমর্থিত কোনও যুক্তিসঙ্গত অর্থের জন্য)।

std::stringএর চেয়ে ভাল আর নয় std::vector<char>: এটি ইউনিকোড (বা অন্য কোনও উপস্থাপনা / এনকোডিং) সম্পর্কে সম্পূর্ণ অসচেতন এবং কেবলমাত্র এটির বিষয়বস্তুকে বাইটের ব্লব হিসাবে বিবেচনা করবে ।

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

আমি এর জন্য পরিচিত একমাত্র বিস্তৃত গ্রন্থাগার হ'ল আইসিইউ । সি ++ ইন্টারফেসটি জাভা এক থেকে নেওয়া হয়েছিল, সুতরাং এটি অহংকারবাদী far



11
@ উফ্লেক্স: আপনি যে পৃষ্ঠাটি সংযুক্ত করেছেন সেখান থেকে এই লক্ষ্যটি অর্জনের জন্য বুস্ট ocলোকালে অত্যাধুনিক ইউনিকোড এবং স্থানীয়করণ লাইব্রেরি ব্যবহার করা হয়েছে: আইসিইউ - ইউনিকোডের জন্য আন্তর্জাতিক উপাদান।
ম্যাথিউ এম।

1
বুস্ট.লোকেল অন্যান্য নন-আইসিইউ ব্যাককেডকে সমর্থন করে, এখানে দেখুন: বুস্ট.আর.ডক
সুপারফ্লাই

@ সুফ্প্লি জোন: সত্য, তবে একই পৃষ্ঠা অনুসারে, নন-আইসিইউ ব্যাকেন্ডের ইউনিকোডের সমর্থন "মারাত্মকভাবে সীমাবদ্ধ"।
ম্যাথিউ এম।

24

আপনি নিশ্চিন্তে একটি হল UTF-8 সংরক্ষণ করতে পারেন std::string(অথবা একটি char[]অথবা char*, যে বিষয়টি জন্য) যে, আসলে একটি ইউনিকোড NUL (ইউ + + 0000) হল UTF-8 একটি নাল বাইট কারণে এবং এই একমাত্র উপায় নাল যে বাইট UTF-8 এ ঘটতে পারে। অত: পর, আপনার হল UTF-8 স্ট্রিং সঠিকভাবে সি এবং সি ++ স্ট্রিং ফাংশন সব অনুযায়ী সমাপ্ত হয়ে যাবে, এবং আপনি তাদের (তত্সহ সি ++ iostreams নিয়ে গুলতি করতে std::coutএবং std::cerr, তাই যতদিন আপনার লোকেল হল UTF-8)।

আপনি std::stringইউটিএফ -8 এর জন্য যা করতে পারবেন না তা কোড পয়েন্টগুলির দৈর্ঘ্য। std::string::size()আপনাকে বাইটে স্ট্রিংয়ের দৈর্ঘ্য বলবে, আপনি যখন ইউটিএফ -8 এর ASCII উপসেটের মধ্যে থাকবেন তখন কোড পয়েন্টের সংখ্যার সমান।

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


3
std::stringএম্বেড থাকা নালগুলি ঠিক জরিমান রেখে আইস্ট্রিমে ফেলে দেওয়া যেতে পারে।
আর মার্টিনহো ফার্নান্দেস

3
এটা সম্পূর্ণ উদ্দেশ্য। এটি কিছুতেই ভাঙেনি c_str()কারণ size()এখনও কাজ করে। কেবলমাত্র ভাঙা APIs (যেমন তারা বেশিরভাগ সি বিশ্বের এম্বেডড নুলগুলি পরিচালনা করতে পারে না) বিরতি।
আর মার্টিনহো ফার্নান্দেস

1
এম্বেডড নুলস ব্রেক হয় c_str()কারণ c_str()সি স্ট্রিং এমবেডেড নাল থাকতে পারে না এই কারণে যে নাল-টার্মিনেটেড সি স্ট্রিং হিসাবে ডেটা ফেরত আসবে বলে মনে করা হচ্ছে --- যা অসম্ভব।
uckelman

4
আর না. c_str()এখন কেবল data()এটি সমস্ত হিসাবে একই হিসাবে ফেরত । যে আকারের APIs এটি গ্রহণ করে তারা তা গ্রাস করতে পারে। এমন API গুলি যা পারে না, পারে না।
আর মার্টিনহো ফার্নান্দেস

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

8

সি ++ 11 এ ইউনিকোডের জন্য বেশ কয়েকটি নতুন আক্ষরিক স্ট্রিংয়ের ধরণ রয়েছে

দুর্ভাগ্যক্রমে অ-ইউনিফর্ম এনকোডিংগুলির (ইউটিএফ -8 এর মতো) স্ট্যান্ডার্ড লাইব্রেরিতে সমর্থন এখনও খারাপ। উদাহরণস্বরূপ, কোনও ইউটিএফ -8 স্ট্রিংয়ের দৈর্ঘ্য (কোড-পয়েন্টগুলিতে) পাওয়ার কোনও দুর্দান্ত উপায় নেই।


সুতরাং আমরা কী এখনও ল্যাটিন-বিহীন ভাষাগুলি সমর্থন করতে চাইলে ফাইল নামের জন্য std :: wstring ব্যবহার করতে হবে? কারণ নতুন স্ট্রিং
লিটারেলগুলি

7
@Uflex std::stringকরতে রাখা সমস্যা ছাড়া একটি হল UTF-8 স্ট্রিং, কিন্তু যেমন lengthপদ্ধতি স্ট্রিং বাইটের সংখ্যা এবং কোড-পয়েন্ট সংখ্যার উল্লেখ করে।
কিছু প্রোগ্রামার ডুড

8
সত্যি কথা বলতে, স্ট্রিংয়ের কোড পয়েন্টগুলিতে দৈর্ঘ্য পাওয়ার অনেকগুলি ব্যবহার নেই। বাইটগুলির দৈর্ঘ্য বাফারগুলিকে সঠিকভাবে প্রাক-বরাদ্দ করতে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ।
আর মার্টিনহো ফার্নান্দিস

2
কোনও ইউটিএফ -8 স্ট্রিংয়ে কোড পয়েন্টের সংখ্যা খুব আকর্ষণীয় নম্বর নয়: কেউ লিখতে পারেন ñ'ল্যাটিন স্মার্ট লেটার এন উইথ টিল্ড' (ইউ + 00 এফ 1) (যা একটি কোড পয়েন্ট) বা 'ল্যাটিন ছোট লেটার এন' ( ইউ + 006E) এর পরে 'কম্বিনিং টিल्ड' (ইউ + 0303) যা দুটি কোড পয়েন্ট।
মার্টিন বোনার

"আপনার এটির দরকার নেই এবং আপনার মতো" কোড পয়েন্টের সংখ্যা গুরুত্বহীন "ইত্যাদি সম্পর্কে এই সমস্ত মন্তব্য আমার কাছে কিছুটা মজাদার মনে হচ্ছে। একবার আপনি কোনও পার্সার লিখুন যা utf8 উত্সের কোডের প্রকারের পার্স করার কথা, এটি পার্সারের স্পেসিফিকেশনের উপর নির্ভর করে এটি LATIN SMALL LETTER N' == বিবেচনা করে কিনা (U+006E) followed by 'COMBINING TILDE' (U+0303)
বিটিক্লার

4

যাইহোক, ক্ষুদ্র-utf8 নামে একটি কার্যকরী দরকারী লাইব্রেরি রয়েছে , যা মূলত / এর জন্য একটি ড্রপ-ইন প্রতিস্থাপন । এটি এখনও নিখোঁজ হওয়া utf8-স্ট্রিং ধারক শ্রেণীর শূন্যস্থান পূরণ করা।std::stringstd::wstring

এটি utf8 স্ট্রিংগুলির সাথে 'ডিল করার' সবচেয়ে আরামদায়ক উপায় হতে পারে (এটি ইউনিকোড নরমালাইজেশন এবং অনুরূপ স্টাফ ছাড়াই)। আপনার স্ট্রিং রান-লেংথ-এনকোড হওয়াগুলিতে এনকোড থাকা অবস্থায় আপনি কোডপয়েন্টগুলিতে স্বাচ্ছন্দ্যে পরিচালনা করেন char

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