තාරකා තල කේත ලක්ෂ්යවලට අදාළ ගැටළු වල දැනට පවතින පිළිතුරු වල කිසිදු සඳහනක් මා දුටුවේ නැත ජාත්යන්තරකරණය . ලබා දී ඇති ස්ක්රිප්ට් එකක් භාවිතා කරමින් “ලොකු අකුරු” යනු සෑම භාෂාවකම එකම දේ නොවේ.
තාරකා තල කේත ලක්ෂ්ය හා සම්බන්ධ ගැටළු වලට මුලදී මම පිළිතුරු දුටුවේ නැත. එහි එක් (මෙම එක් වනු ඇත වැනි මම හිතන්නේ!), නමුත්, එය ටිකක් තැන්පත් වෙනවා
යෝජිත කාර්යයන් බොහොමයක් මේ ආකාරයෙන් පෙනේ:
function capitalizeFirstLetter(str) {
return str[0].toUpperCase() + str.slice(1);
}
කෙසේ වෙතත්, සමහර අක්ෂර අක්ෂර BMP වලින් පිටත වැටේ (මූලික බහුභාෂා තලය, කේත ලකුණු U + 0 සිට U + FFFF දක්වා). උදාහරණයක් ලෙස මෙම Deseret පා take ය ගන්න:
capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉"); // "𐐶𐐲𐑌𐐼𐐲𐑉"
මෙහි පළමු අක්ෂරය ප්රාග්ධනීකරණය කිරීමට අසමත් වන්නේ නූල් වල අරාව-සුචිගත කරන ලද ගුණාංග “අක්ෂර” හෝ කේත ලක්ෂ්යවලට ප්රවේශ නොවන බැවිනි. ඔවුන් UTF-16 කේත ඒකක වලට ප්රවේශ වේ. පෙති කපන විටද මෙය සත්ය වේ - දර්ශක අගයන් කේත ඒකක වෙත යොමු වේ.
එය සිදුවන්නේ යූටීඑෆ් -16 කේත ඒකක 1: 1 ක් වන අතර යූඑස්වී කේත ලක්ෂ්ය පරාස දෙකක් තුළ ය, යූ + 0 සිට යූ + ඩී 7 එෆ්එෆ් සහ යූ + ඊ 1000 සිට යූ + එෆ්එෆ්එෆ්එෆ් ඇතුළත් වේ. බොහෝ අක්ෂර අක්ෂර එම පරාස දෙකට වැටේ, නමුත් ඒවා සියල්ලම නොවේ.
ES2015 සිට මේ සමඟ කටයුතු කිරීම ටිකක් පහසු විය. String.prototype[@@iterator]
කේත ලකුණු වලට අනුරූප නූල් ලබා දෙයි **. උදාහරණයක් ලෙස, අපට මෙය කළ හැකිය:
function capitalizeFirstLetter([ first, ...rest ]) {
return [ first.toUpperCase(), ...rest ].join('');
}
capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"
දිගු නූල් සඳහා, මෙය බොහෝ විට කාර්යක්ෂම නොවේ *** - ඉතිරි කොටස නැවත කියවීමට අපට අවශ්ය නැත. අපට භාවිතා කළ හැකියString.prototype.codePointAt
එම පළමු (හැකි) ලිපිය ලබා ගැනීමට කළ හැකිය, නමුත් පෙත්ත ආරම්භ විය යුත්තේ කොතැනින්ද යන්න අපට තවමත් තීරණය කළ යුතුය. ඉතිරිය නැවත නොකිරීමට එක් ක්රමයක් නම් පළමු කේත ලක්ෂ්යය BMP වලින් පිටත දැයි පරීක්ෂා කිරීමයි; එය එසේ නොවේ නම්, පෙත්ත 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 සහ ඊට පහළින් මෙම කාර්යය කළ හැකිය. කේත ලක්ෂ්ය සමඟ වැඩ කිරීම සඳහා ES5 හි සහජ ක්රම නොමැත, එබැවින් පළමු කේත ඒකකය අන්යාගමිකද යන්න අප විසින් අතින් පරීක්ෂා කළ යුතුය ****:
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("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"
ආරම්භයේ දී මම ජාත්යන්තරකරණ සලකා බැලීම් ද සඳහන් කළෙමි. මේවායින් සමහරක් ගණනය කිරීම ඉතා අපහසු වන්නේ ඔවුන්ට දැනුම පමණක් අවශ්ය නොවන බැවිනි කුමක් ගැන භාෂාව භාවිතා කොට ඇත, පමණක් නොව, භාෂාව යන වචන නිශ්චිත දැනුම අවශ්ය විය හැක. උදාහරණයක් ලෙස, අයර්ලන්ත ඩිග්රැෆ් "mb" වචනයේ ආරම්භයේදීම "mB" ලෙස ප්රාග්ධනීකරණය කරයි. තවත් උදාහරණයක්, ජර්මානු එසෙට්, කිසි විටෙක වචනයක් (අෆයික්) ආරම්භ නොකරයි, නමුත් ගැටලුව නිරූපණය කිරීමට තවමත් උපකාරී වේ. සිම්පල් එසෙට් (“ß”) “එස්එස්” ලෙස ප්රාග්ධනීකරණය කරයි, නමුත් “එස්එස්” ට “ß” හෝ “එස්එස්” ලෙස කුඩා කළ හැකිය - නිවැරදි දේ දැන ගැනීමට ඔබට ජර්මානු භාෂාව පිළිබඳ බාහිර දැනුමක් අවශ්ය වේ!
මේ ආකාරයේ ගැටළු වලට වඩාත්ම ප්රසිද්ධ උදාහරණය බොහෝ විට තුර්කි ය. තුර්කි ලතින් භාෂාවෙන්, i හි ප්රාග්ධන ස්වරූපය is වන අතර, මගේ කුඩා අකුර is වේ - ඒවා වෙනස් අක්ෂර දෙකකි. වාසනාවකට අපට මේ සඳහා ගණන් දිය හැකි ක්රමයක් තිබේ:
function capitalizeFirstLetter([ first, ...rest ], locale) {
return [ first.toLocaleUpperCase(locale), ...rest ].join('');
}
capitalizeFirstLetter("italy", "en") // "Italy"
capitalizeFirstLetter("italya", "tr") // "İtalya"
බ්රව්සරයක, පරිශීලකයාගේ වඩාත්ම කැමති භාෂා ටැගය මඟින් දක්වනු ලැබේ navigator.language
, මනාප අනුපිළිවෙලින් ලැයිස්තුවක් සොයාගත හැකි අතර navigator.languages
, ලබා දී ඇති DOM මූලද්රව්යයේ භාෂාව 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 පෙබරවාරි), ෆයර්ෆොක්ස් / ස්පයිඩර්මන්කි විසින් පසුගිය දෙවසර තුළ හඳුන්වා දුන් රෙජීඑක්ස් විශේෂාංග කිසිවක් තවමත් ක්රියාත්මක කර නොමැත *****. ඔබට මෙම අංගයේ වත්මන් තත්වය කැන්ගක්ස් සංයුක්ත වගුවෙන් පරීක්ෂා කළ හැකිය . රෙජෙක්ස් වචනාර්ථයෙන් තොරව සමාන රටාවන්ට දේපල යොමු කිරීම් සමඟ සම්පාදනය කිරීමට බාබෙල්ට හැකි නමුත් එහි ප්රති code ලය වන කේතය අති විශාල විය හැකි බව මතක තබා ගන්න.
බොහෝ දුරට, මෙම ප්රශ්නය අසන පුද්ගලයින් ඩෙසරෙට් ප්රාග්ධනීකරණය හෝ ජාත්යන්තරකරණය ගැන සැලකිලිමත් නොවනු ඇත. නමුත් මෙම ගැටළු පිළිබඳව දැනුවත්ව සිටීම හොඳය, මන්දයත් වර්තමානයේදී ඒවා ගැන සැලකිලිමත් නොවුනත් අවසානයේදී ඔබට ඒවා හමුවීමට හොඳ අවස්ථාවක් තිබේ. ඒවා “එජ්” නඩු නොවේ, නැතහොත් ඒවා අර්ථ දැක්වීමේ අද්දර අවස්ථා නොවේ - බොහෝ අය තුර්කි භාෂාව කථා කරන මුළු රටක්ම ඇත, කෙසේ වෙතත්, කේත ඒකක සමඟ කේත ඒකක ගැටීම තරමක් පොදු දෝෂ ප්රභවයකි (විශේෂයෙන් ඉමොජි සම්බන්ධයෙන්). නූල් සහ භාෂාව යන දෙකම සෑහෙන්න සංකීර්ණයි!
* UTF-16 / UCS2 හි කේත ඒකක ද යුනිකෝඩ් කේත ලක්ෂ්ය වේ. උදා: U + D800 තාක්ෂණිකව කේත ලක්ෂ්යයකි, නමුත් එය මෙහි “තේරුම” නොවේ ... වර්ග කිරීම ... එය ලස්සන වුව ද නොපැහැදිලි. අන්යාගමිකයින් අනිවාර්යයෙන්ම USVs නොවේ (යුනිකෝඩ් පරිමාණ අගයන්).
** අන්යාදේශ කේත ඒකකයක් “අනාථ” නම් - එනම්, තාර්කික යුගලයක කොටසක් නොවේ - ඔබට තවමත් මෙහි අන්යාගමිකයින් ලබා ගත හැකිය.
*** සමහරවිට. මම එය අත්හදා බැලුවේ නැත. ප්රාග්ධනීකරණය අර්ථවත් බාධකයක් බව ඔබ තීරණය කර නොමැති නම්, මම එය දහඩිය දමන්නේ නැත - වඩාත්ම පැහැදිලි හා කියවිය හැකි යැයි ඔබ විශ්වාස කරන ඕනෑම දෙයක් තෝරන්න.
**** එවැනි ශ්රිතයක් පළමු ඒකකය වෙනුවට පළමු හා දෙවන කේත ඒකක දෙකම පරීක්ෂා කිරීමට කැමති විය හැකිය, මන්ද පළමු ඒකකය අනාථ අන්යාගමිකයෙකු විය හැකි බැවිනි. උදාහරණයක් ලෙස "D uD800x" ආදානය X ප්රාග්ධනීකරණය කරයි, එය අපේක්ෂා කළ හැකි හෝ නොවිය හැකිය.
***** ප්රගතිය වඩාත් .ජුව අනුගමනය කිරීමට ඔබට අවශ්ය නම් මෙන්න බග්සිලා ප්රශ්නය .