অ্যাস্ট্রাল প্লেন কোড পয়েন্ট বা আন্তর্জাতিকীকরণ সম্পর্কিত ইস্যুগুলির বিদ্যমান উত্তরের আমি কোনও উল্লেখ দেখতে পাইনি । "বড় হাতের" অর্থ প্রদত্ত স্ক্রিপ্ট ব্যবহার করে প্রতিটি ভাষায় একই জিনিস বোঝায় না।
প্রথমদিকে আমি অ্যাস্ট্রাল প্লেন কোড পয়েন্ট সম্পর্কিত ইস্যু সম্বোধনের কোনও উত্তর দেখতে পাইনি। সেখানে এক , কিন্তু এটি একটি বিট দাফন এর (এই এক মত হতে হবে, আমি অনুমান!)
প্রস্তাবিত ফাংশনগুলির বেশিরভাগ দেখতে এইরকম:
function capitalizeFirstLetter(str) {
return str[0].toUpperCase() + str.slice(1);
}
তবে কিছু কেসযুক্ত অক্ষর বিএমপির বাইরে পড়ে (বেসিক বহুভাষিক বিমান, কোড পয়েন্ট U + 0 থেকে ইউ + এফএফএফএফ)। উদাহরণস্বরূপ এই Deseret পাঠ্য গ্রহণ করুন:
capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉"); // "𐐶𐐲𐑌𐐼𐐲𐑉"
এখানে প্রথম অক্ষর মূলধন ব্যর্থ হয় কারণ অ্যারের-সূচিযুক্ত বৈশিষ্ট্যের স্ট্রিংগুলির "অক্ষর" বা কোড পয়েন্ট * অ্যাক্সেস হয় না। তারা ইউটিএফ -16 কোড ইউনিট অ্যাক্সেস করে। টুকরো টুকরো করার সময়ও এটি সত্য - কোড ইউনিটগুলিতে সূচকের মান বিন্দু।
এটি এমনটি ঘটে যে ইউটিএফ -১ code কোড ইউনিটগুলি দুটি রেঞ্জের মধ্যে ইউএসভি কোড পয়েন্ট সহ 1: 1 হয়, U + 0 থেকে U + D7FF এবং U + E000 থেকে U + FFFF অন্তর্ভুক্ত থাকে। বেশিরভাগ কেসযুক্ত অক্ষরগুলি এই দুটি ব্যাপ্তিতে পড়ে তবে সেগুলির সবকটিই নয়।
ES2015 থেকে, এর সাথে ডিল করা কিছুটা সহজ হয়ে গেছে। String.prototype[@@iterator]
কোড পয়েন্ট ** এর সাথে সম্পর্কিত স্ট্রিং দেয়। সুতরাং উদাহরণস্বরূপ, আমরা এটি করতে পারি:
function capitalizeFirstLetter([ first, ...rest ]) {
return [ first.toUpperCase(), ...rest ].join('');
}
capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"
দীর্ঘতর স্ট্রিংয়ের জন্য, এটি সম্ভবত মারাত্মকভাবে দক্ষ নয় *** - আমাদের বাকীটি পুনরুক্ত করার দরকার নেই। আমরা String.prototype.codePointAt
সেই প্রথম (সম্ভাব্য) চিঠিটি পেতে ব্যবহার করতে পারি, তবে আমাদের এখনও স্লাইসটি কোথায় শুরু করা উচিত তা নির্ধারণ করতে চাই। বাকীটির পুনরাবৃত্তি এড়ানোর একটি উপায় হ'ল প্রথম কোডপয়েন্টটি বিএমপির বাইরে রয়েছে কিনা তা পরীক্ষা করা; যদি এটি না হয়, স্লাইসটি 1 থেকে শুরু হয়, এবং যদি এটি হয় তবে স্লাইসটি 2 থেকে শুরু হয়।
function capitalizeFirstLetter(str) {
const firstCP = str.codePointAt(0);
const index = firstCP > 0xFFFF ? 2 : 1;
return String.fromCodePoint(firstCP).toUpperCase() + str.slice(index);
}
capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"
আপনি > 0xFFFF
সেখানে পরিবর্তে বিটওয়াইড গণিত ব্যবহার করতে পারেন , তবে এটি সম্ভবত এটি সহজভাবে বোঝা সহজ এবং হয় একই জিনিসটি অর্জন করতে পারে।
প্রয়োজনে আমরা যুক্তিটিকে আরও কিছুটা এগিয়ে নিয়ে ES5 এবং নীচেও এই কাজটি করতে পারি। কোডপয়েন্টের সাথে কাজ করার জন্য ইএস 5 তে কোনও অন্তর্নিহিত পদ্ধতি নেই, সুতরাং আমাদের প্রথম কোড ইউনিটটি কোনও সারোগেট কিনা তা ম্যানুয়ালি পরীক্ষা করতে হবে ****:
function capitalizeFirstLetter(str) {
var firstCodeUnit = str[0];
if (firstCodeUnit < '\uD800' || firstCodeUnit > '\uDFFF') {
return str[0].toUpperCase() + str.slice(1);
}
return str.slice(0, 2).toUpperCase() + str.slice(2);
}
capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"
শুরুতে আমি আন্তর্জাতিকীকরণ বিবেচনার বিষয়টিও উল্লেখ করেছি। এর মধ্যে কিছু কারণ তারা না শুধুমাত্র জ্ঞান থাকা আবশ্যক হিসাব খুব কঠিন হয় কি ভাষাটি ব্যবহার করা হচ্ছে তা নয়, তবে ভাষার শব্দগুলির নির্দিষ্ট জ্ঞানের প্রয়োজনও থাকতে পারে knowledge উদাহরণস্বরূপ, আইরিশ ডিগ্রাফ "এমবি" একটি শব্দের শুরুতে "এমবি" হিসাবে মূলধন করে। আরেকটি উদাহরণ, জার্মান এসেট, কখনও কোনও শব্দ (আফাইক) শুরু করে না, তবে তবুও সমস্যাটি বোঝাতে সহায়তা করে। লোয়ারকেস এসেট ("ß") "এসএস" এর মূলধন করে তবে "এসএস" "ß" বা "এসএস" এর মধ্যে ছোট করে দিতে পারে - কোনটি সঠিক তা জানতে আপনার জার্মান ভাষার বাইরের ব্যান্ড জ্ঞান প্রয়োজন!
এই ধরণের সমস্যার সর্বাধিক বিখ্যাত উদাহরণ হ'ল তুর্কী। তুর্কি লাতিন ভাষায়, আমার মূলধন হ'ল while, যখন আমি ছোট হাতের আকার ı - এগুলি দুটি ভিন্ন বর্ণ। ভাগ্যক্রমে আমাদের কাছে এটির অ্যাকাউন্ট দেওয়ার উপায় রয়েছে:
function capitalizeFirstLetter([ first, ...rest ], locale) {
return [ first.toLocaleUpperCase(locale), ...rest ].join('');
}
capitalizeFirstLetter("italy", "en") // "Italy"
capitalizeFirstLetter("italya", "tr") // "İtalya"
একটি ব্রাউজারে, ব্যবহারকারীর সর্বাধিক পছন্দের ভাষা ট্যাগটি নির্দেশিত হয় navigator.language
, পছন্দ অনুসারে একটি তালিকা পাওয়া যায় navigator.languages
এবং একটি প্রদত্ত ডিওএম উপাদানটির ভাষা Object(element.closest('[lang]')).lang || YOUR_DEFAULT_HERE
বহুভাষিক নথির সাথে পাওয়া যায় (সাধারণত) ।
ES2018-এ প্রবর্তিত RegExp- এ ইউনিকোড সম্পত্তি চরিত্রের ক্লাসগুলিকে সমর্থনকারী এজেন্টগুলিতে, আমরা কী চরিত্রগুলিতে আগ্রহী তা সরাসরি প্রকাশ করে আমরা আরও জিনিসপত্র পরিষ্কার করতে পারি:
function capitalizeFirstLetter(str, locale=navigator.language) {
return str.replace(/^\p{CWU}/u, char => char.toLocaleUpperCase(locale));
}
মোটামুটি ভাল নির্ভুলতার সাথে একটি স্ট্রিংয়ের একাধিক শব্দকে বড় আকারের হ্যান্ডেল করতেও এটি কিছুটা টুইঙ্ক করা যায়। CWU
বা Changes_When_Uppercased চরিত্র সম্পত্তি সমস্ত কোড পয়েন্ট যা, ভাল, পরিবর্তন যখন uppercased সাথে মেলে। আমরা ডাচ মত একটি titlecased digraph অক্ষর আউট এই চেষ্টা করতে পারেন ij উদাহরণস্বরূপ:
capitalizeFirstLetter('ijsselmeer'); // "IJsselmeer"
লেখার সময় (ফেব্রুয়ারী 2020), ফায়ারফক্স / স্পাইডারমনকি গত দুই বছরে প্রবর্তিত কোনও রেজিএক্সপ ফিচার ***** এখনও কার্যকর করেনি ** আপনি কঙ্গাক্স কম্প্যাট টেবিলটিতে এই বৈশিষ্ট্যের বর্তমান অবস্থা পরীক্ষা করতে পারেন । বাবেল রেজিপ্লেষের অক্ষরগুলিকে সম্পত্তির রেফারেন্সগুলি ছাড়াই তাদের ব্যতীত সমষ্টি নিদর্শনগুলির সাথে সংকলন করতে সক্ষম হয়, তবে সচেতন হন যে ফলাফল কোডটি প্রচুর হতে পারে।
সমস্ত সম্ভাবনায়, এই প্রশ্নটি জিজ্ঞাসা করা লোকেরা ডিসেরেট মূলধন বা আন্তর্জাতিকীকরণের সাথে উদ্বিগ্ন হবে না। তবে এই বিষয়গুলি সম্পর্কে সচেতন হওয়া ভাল কারণ আপনার বর্তমানে উদ্বেগ না থাকলেও অবশেষে তাদের মুখোমুখি হওয়ার একটি ভাল সুযোগ রয়েছে। এগুলি "প্রান্ত" কেস নয়, বরং তারা উপ-সংজ্ঞা প্রান্তের মামলা নয় - এমন একটি পুরো দেশ রয়েছে যেখানে বেশিরভাগ লোক তুর্কি, যে কোনওভাবেই কথা বলে এবং কোডপয়েন্টের সাথে কোড ইউনিটকে বিভক্ত করা একটি বাগের মোটামুটি সাধারণ উত্স (বিশেষত সাথে ইমোজি সম্পর্কিত)। স্ট্রিং এবং ভাষা উভয়ই বেশ জটিল!
* ইউটিএফ -16 / ইউসিএস 2 এর কোড ইউনিটগুলি ইউনিকোড কোড পয়েন্টও এই অর্থে যে ইউ + ডি 800 প্রযুক্তিগতভাবে একটি কোড পয়েন্ট, তবে এটি এখানে "অর্থ" নয় ... সাজানো ... যদিও এটি সুন্দর হয়ে যায় ঝাপসা। সরোগেটগুলি অবশ্যই ইউএসভি (ইউনিকোড স্কেলারের মান) নয়।
** যদিও কোনও সারোগেট কোড ইউনিট যদি "অনাথ" হয় - অর্থাত্ লজিক্যাল জোড়ের অংশ না হয় - তবে আপনি এখানেও সারোগেট পেতে পারেন।
*** হতে পারে. আমি এটি পরীক্ষা করিনি। যদি আপনি নির্ধারণ না করেন যে মূলধনটি অর্থবহ এক বাধা হয়ে দাঁড়ায়, আমি সম্ভবত এটি ঘামতে পারব না - আপনি যা বিশ্বাস করেন তা সবচেয়ে স্পষ্ট এবং পঠনযোগ্য চয়ন করুন।
**** এই জাতীয় ফাংশন কেবল প্রথমটির পরিবর্তে প্রথম এবং দ্বিতীয় কোড একক উভয়ই পরীক্ষা করতে পারে, কারণ এটি প্রথম ইউনিট অনাথ সারোগেটের পক্ষে সম্ভব। উদাহরণস্বরূপ ইনপুট "D uD800x" এক্সকে যেমন হয় তেমন মূলধন তৈরি করবে, যা প্রত্যাশিত বা নাও হতে পারে।
***** আপনি যদি আরও সরাসরি অগ্রগতি অনুসরণ করতে চান তবে এখানে বাগজিলা সমস্যা রয়েছে ।