Ð ÑÑÐ¾Ð¼Ñ ÑоздÑÐ»Ñ Ð¼Ð¸ занÑÑимоÑÑ Ñ Ð²Ð½ÑÑÑÑÑÐ½Ñ Ð±ÑÐ´Ð¾Ð²Ñ ÑÑдкÑв. Ð¦Ñ Ð·Ð½Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ð´Ð¾Ð±Ð»ÑÑÑÑÑ Ð²Ð°Ð¼, ÑкÑо ви планÑÑÑе маÑи ÑпÑÐ°Ð²Ñ Ð· емодзÑ, ÑÑдкÑÑними маÑемаÑиÑними Ñи ÑÑÑоглÑÑÑÑними Ñимволами Ñа ÑнÑими винÑÑковими Ñимволами.
Як вже вÑдомо, ÑÑдки в JavaScript базÑÑÑÑÑÑ Ð½Ð° ЮнÑкодÑ: кожен Ñимвол â Ñе поÑлÑдовнÑÑÑÑ Ð· 1-4 байÑÑв.
JavaScript дозволÑÑ Ð½Ð°Ð¼ вÑÑавлÑÑи Ñимвол в ÑÑдок, вказÑÑÑи його ÑÑÑÑнадÑÑÑковий код ЮнÑкод за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¾Ð´Ð½ÑÑÑ Ð· ÑÑÑÐ¾Ñ Ð½Ð¾ÑаÑÑй нижÑе:
-
\xXXде
XXповинно бÑÑи двома ÑÑÑÑнадÑÑÑковими ÑиÑÑами Ð·Ñ Ð·Ð½Ð°ÑеннÑм мÑж00ÑаFF, Ñк наÑлÑдок,\xXXâ Ñе Ñимвол, код Ñкого в ЮнÑÐºÐ¾Ð´Ñ Ð²ÑдповÑдаÑXX.ÐÑкÑлÑки
\xXXноÑаÑÑÑ Ð¿ÑдÑÑимÑÑ ÑÑлÑки Ð´Ð²Ñ ÑÑÑÑнадÑÑÑÐºÐ¾Ð²Ñ ÑиÑÑи, ÑÑ Ð¼Ð¾Ð¶Ð½Ð° викоÑиÑÑовÑваÑи лиÑе Ð´Ð»Ñ Ð¿ÐµÑÑÐ¸Ñ 256 ÑимволÑв ЮнÑкодÑ.Ð¦Ñ Ð¿ÐµÑÑÑ 256 ÑимволÑв вклÑÑаÑÑÑ Ñ Ñебе лаÑинÑÑкий алÑавÑÑ, бÑлÑÑÑÑÑÑ ÑинÑакÑиÑÐ½Ð¸Ñ ÑимволÑв Ñ Ð´ÐµÑÐºÑ ÑнÑÑ. ÐÐ»Ñ Ð¿ÑикладÑ,
"\x7A"â Ñе Ñе ж Ñаме, Ñо й"z"(ЮнÑкодU+007A).alert( "\x7A" ); // z alert( "\xA9" ); // ©, Ñимвол авÑоÑÑÑкого пÑава -
\uXXXXдеXXXXповинно ÑкладаÑиÑÑ Ð· ÑÑвно 4-Ð¾Ñ ÑÑÑÑнадÑÑÑÐºÐ¾Ð²Ð¸Ñ ÑиÑÑ Ñз знаÑеннÑми мÑж0000ÑаFFFF, Ñк наÑлÑдок,\uXXXXâ Ñе Ñимвол, код Ñкого в ЮнÑÐºÐ¾Ð´Ñ Ð²ÑдповÑдаÑXXXX.Символи з ЮнÑкод знаÑеннÑми , бÑлÑÑими за
U+FFFF, Ñакож можÑÑÑ Ð±ÑÑи пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÑÑÑÑ Ð½Ð¾ÑаÑÑÑ, але в ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð½Ð°Ð¼ поÑÑÑбно бÑде викоÑиÑÑовÑваÑи Ñак Ð·Ð²Ð°Ð½Ñ ÑÑÑогаÑÐ½Ñ Ð¿Ð°ÑÑ (пÑо ÑÑÑогаÑÐ½Ñ Ð¿Ð°Ñи ми поговоÑимо пÑзнÑÑе в ÑÑй главÑ).alert( "\u00A9" ); // ©, Ñе ж Ñаме, Ñо й \xA9, ÑÑлÑки з викоÑиÑÑаннÑм 4-Ð¾Ñ ÑимволÑÐ½Ð¾Ñ ÑÑÑÑнадÑÑÑÐºÐ¾Ð²Ð¾Ñ Ð½Ð¾ÑаÑÑÑ alert( "\u044F" ); // Ñ, бÑква киÑилиÑÑ alert( "\u2191" ); // â, Ñимвол ÑÑÑÑлки вгоÑÑ -
\u{Xâ¦XXXXXX}де
Xâ¦XXXXXXповинно бÑÑи ÑÑÑÑнадÑÑÑковим знаÑеннÑм вÑд 1 до 6 байÑÑв мÑж0Ñа10FFFF(найвиÑа кодова ÑоÑка, визнаÑена ÑÑандаÑÑом ЮнÑкод). Ð¦Ñ Ð½Ð¾ÑаÑÑÑ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑ Ð½Ð°Ð¼ легко пÑедÑÑавиÑи вÑÑ ÑÑнÑÑÑÑ Ñимволи ЮнÑкодÑ.alert( "\u{20331}" ); // 佫, ÑÑдкÑÑний киÑайÑÑкий ÑÑÑоглÑÑ (довгий ЮнÑкод) alert( "\u{1F60D}" ); // ð, Ñимвол ÑÑмÑÑ Ð½ÐµÐ½Ð½Ð¾Ð³Ð¾ облиÑÑÑ (Ñе один довгий ЮнÑкод)
СÑÑогаÑÐ½Ñ Ð¿Ð°Ñи
УÑÑ Ð½Ð°Ð¹Ð¿Ð¾ÑиÑинÑÑÑ Ñимволи маÑÑÑ 2-байÑÐ¾Ð²Ñ ÐºÐ¾Ð´Ð¸ (4 ÑÑÑÑнадÑÑÑÐºÐ¾Ð²Ñ ÑиÑÑи). ÐÑкви в бÑлÑÑоÑÑÑ ÑвÑопейÑÑÐºÐ¸Ñ Ð¼Ð¾Ð², ÑиÑÑи Ñа оÑÐ½Ð¾Ð²Ð½Ñ ÑнÑÑÑÐºÐ¾Ð²Ð°Ð½Ñ ÑдеогÑаÑÑÑÐ½Ñ Ð½Ð°Ð±Ð¾Ñи CJK (CJK â киÑайÑÑка, ÑпонÑÑка Ñа коÑейÑÑка ÑиÑÑеми пиÑÑма) маÑÑÑ 2-байÑове пÑедÑÑавленнÑ.
СпоÑаÑÐºÑ JavaScript базÑвавÑÑ Ð½Ð° кодÑÐ²Ð°Ð½Ð½Ñ UTF-16, Ñке допÑÑкало лиÑе 2 байÑи на Ñимвол. Ðле 2 байÑи забезпеÑÑÑÑÑ Ð»Ð¸Ñе 65536 комбÑнаÑÑй, а ÑÑого недоÑÑаÑнÑо Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ можливого ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð®Ð½ÑкодÑ.
Тож ÑÑдкÑÑÐ½Ñ Ñимволи, ÑÐºÑ Ð¿Ð¾ÑÑебÑÑÑÑ Ð±ÑлÑÑе 2-Ð¾Ñ Ð±Ð°Ð¹ÑÑв, кодÑÑÑÑÑÑ Ð¿Ð°ÑÐ¾Ñ 2-байÑÐ¾Ð²Ð¸Ñ ÑимволÑв, ÑÐºÑ Ð½Ð°Ð·Ð¸Ð²Ð°ÑÑÑÑÑ âÑÑÑогаÑÐ½Ð¾Ñ Ð¿Ð°ÑоÑâ.
ÐобÑÑним еÑекÑом Ñ Ñе, Ñо довжина ÑакиÑ
ÑимволÑв ÑÑвна 2:
alert( 'ð³'.length ); // 2, маÑемаÑиÑний Ñимвол, велика X
alert( 'ð'.length ); // 2, облиÑÑÑ Ð·Ñ ÑлÑозами ÑадоÑÑÑ
alert( 'ð©·¶'.length ); // 2, ÑÑдкÑÑний киÑайÑÑкий ÑÑÑоглÑÑ
Це пÑаÑÑÑ Ñаким Ñином, бо ÑÑÑогаÑÐ½Ð¸Ñ Ð¿Ð°Ñ Ð½Ðµ ÑÑнÑвало в Ñой ÑаÑ, коли бÑв ÑÑвоÑений JavaScript, Ñ ÑÐ¾Ð¼Ñ Ð²Ð¾Ð½Ð¸ не обÑоблÑÑÑÑÑÑ Ð¼Ð¾Ð²Ð¾Ñ Ð½Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¼ Ñином!
ФакÑиÑно ми маÑмо один Ñимвол Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð¼Ñ Ð· наведениÑ
виÑе ÑÑдкÑв, але влаÑÑивÑÑÑÑ length показÑÑ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ñ 2.
ÐÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ñакож може бÑÑи Ñкладним, оÑкÑлÑки бÑлÑÑÑÑÑÑ Ð¼Ð¾Ð²Ð½Ð¸Ñ ÑÑнкÑÑй ÑозглÑдаÑÑÑ ÑÑÑогаÑÐ½Ñ Ð¿Ð°Ñи Ñк два Ñимволи.
ÐапÑиклад, ÑÑÑ Ð¼Ð¸ баÑимо два Ð´Ð¸Ð²Ð½Ð¸Ñ Ñимвола пÑи виводÑ:
alert( 'ð³'[0] ); // показÑÑ Ð´Ð¸Ð²Ð½Ñ Ñимволи...
alert( 'ð³'[1] ); // ...ÑаÑÑини ÑÑÑогаÑÐ½Ð¾Ñ Ð¿Ð°Ñи
ЧаÑÑини ÑÑÑогаÑÐ½Ð¾Ñ Ð¿Ð°Ñи не маÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð° без одноÑ. ÐÑже, ÑповÑÑÐµÐ½Ð½Ñ Ñ Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð¼Ñ Ð²Ð¸Ñе пÑÐ¸ÐºÐ»Ð°Ð´Ñ ÑакÑиÑно вÑдобÑажаÑÑÑ ÑаÑабаÑÑинÑ.
ТеÑ
нÑÑно ÑÑÑогаÑÐ½Ñ Ð¿Ð°Ñи Ñакож можна визнаÑиÑи за ÑÑ
нÑми кодами: ÑкÑо Ñимвол Ð¼Ð°Ñ ÐºÐ¾Ð´ в ÑнÑеÑÐ²Ð°Ð»Ñ 0xd800..0xdbff, Ñо Ñе пеÑÑа ÑаÑÑина ÑÑÑогаÑÐ½Ð¾Ñ Ð¿Ð°Ñи. ÐаÑÑÑпний Ñимвол (дÑÑга ÑаÑÑина) повинен маÑи код в ÑнÑеÑÐ²Ð°Ð»Ñ 0xdc00..0xdfff. Ð¦Ñ ÑнÑеÑвали заÑезеÑÐ²Ð¾Ð²Ð°Ð½Ñ ÑÑандаÑÑом виклÑÑно Ð´Ð»Ñ ÑÑÑогаÑниÑ
паÑ.
Ð¢Ð¾Ð¼Ñ Ð´Ð»Ñ ÑобоÑи з ÑÑÑогаÑними паÑами в JavaScript бÑли Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð¼ÐµÑоди String.fromCodePoint Ñа str.codePointAt.
Ðо ÑÑÑÑ, вони ÑÐ°ÐºÑ Ð¶, Ñк Ñ String.fromCharCode Ñа str.charCodeAt, але з ÑÑÑогаÑними паÑами поводÑÑÑÑÑ ÐºÐ¾ÑекÑно.
ТÑÑ Ð¼Ð¾Ð¶Ð½Ð° побаÑиÑи ÑÑзниÑÑ:
// charCodeAt не Ð·Ð½Ð°Ñ Ð¿Ñо ÑÑÑогаÑÐ½Ñ Ð¿Ð°ÑÑ, ÑÐ¾Ð¼Ñ Ð½Ð°Ð´Ð°Ñ ÐºÐ¾Ð´Ð¸ Ð´Ð»Ñ 1-Ñ ÑаÑÑини ð³:
alert( 'ð³'.charCodeAt(0).toString(16) ); // d835
// codePointAt Ð·Ð½Ð°Ñ Ð¿Ñо ÑÑÑогаÑÐ½Ñ Ð¿Ð°ÑÑ
alert( 'ð³'.codePointAt(0).toString(16) ); // 1d4b3, зÑиÑÑÑ Ð¾Ð±Ð¸Ð´Ð²Ñ ÑаÑÑини ÑÑÑогаÑÐ½Ð¾Ñ Ð¿Ð°Ñи
Тим не менÑ, ÑкÑо ми намагаÑмоÑÑ Ð¾ÑÑимаÑи ÑезÑлÑÑÐ°Ñ Ð· позиÑÑÑ 1 (Ñе ÑÑлÑки Ð´Ð»Ñ Ð¿ÑикладÑ, Ñак ÑобиÑи непÑавилÑно), Ñо вони обидва повеÑÑаÑÑÑ Ð»Ð¸Ñе 2-Ð³Ñ ÑаÑÑÐ¸Ð½Ñ Ð¿Ð°Ñи:
alert( 'ð³'.charCodeAt(1).toString(16) ); // dcb3
alert( 'ð³'.codePointAt(1).toString(16) ); // dcb3
// беззмÑÑÑовна 2-а половина паÑи
Ðи знайдеÑе бÑлÑÑе ÑпоÑобÑв ÑобоÑи Ñз ÑÑÑогаÑними паÑами пÑзнÑÑе в ÑоздÑÐ»Ñ ÐÑеÑаÑÐ¸Ð²Ð½Ñ Ð¾Ð±âÑкÑи. ÐмовÑÑно, Ð´Ð»Ñ ÑÑого Ñакож ÑÑнÑÑÑÑ ÑпеÑÑалÑÐ½Ñ Ð±ÑблÑоÑеки, але вони не наÑÑÑлÑки вÑдомÑ, Ñоб можна бÑло ÑÑ ÑÑÑ Ð·Ð°Ð¿ÑопонÑваÑи.
Ðи не можемо пÑоÑÑо ÑоздÑлиÑи ÑÑдок Ñ Ð´Ð¾Ð²ÑлÑнÑй позиÑÑÑ, напÑиклад, за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ str.slice(0, 8) Ñ Ð¾ÑÑкÑваÑи, Ñо Ñе бÑде дÑйÑний ÑÑдок, напÑиклад:
alert( 'ÐÑивÑÑ ð'.slice(0, 8) ); // ÐÑивÑÑ [?]
ТÑÑ Ð¼Ð¸ можемо побаÑиÑи незÑозÑмÑлий Ñимвол (пеÑÑÑ Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñ ÑÑÑогаÑÐ½Ð¾Ñ Ð¿Ð°Ñи поÑмÑÑки) Ñ Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð¸Ñ .
ÐÑоÑÑо памâÑÑайÑе пÑо Ñе, ÑкÑо ви Ñ Ð¾ÑеÑе надÑйно пÑаÑÑваÑи Ñз ÑÑÑогаÑними паÑами. Ðожливо, Ñе не велика пÑоблема, але пÑÐ¸Ð½Ð°Ð¹Ð¼Ð½Ñ Ð²Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ ÑозÑмÑÑи, Ñо вÑдбÑваÑÑÑÑÑ.
ÐÑакÑиÑиÑÐ½Ñ Ð·Ð½Ð°ÐºÐ¸ Ñа ноÑмалÑзаÑÑÑ
У багаÑÑÐ¾Ñ Ð¼Ð¾Ð²Ð°Ñ Ñ Ñимволи, ÑÐºÑ ÑкладаÑÑÑÑÑ Ð· оÑновного ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ñа Ð·Ð½Ð°ÐºÑ Ð½Ð°Ð´/пÑд ним.
ÐапÑиклад, лÑÑеÑа a може бÑÑи базовим Ñимволом Ð´Ð»Ñ ÑакиÑ
ÑимволÑв: à áâäãåÄ.
ÐÑлÑÑÑÑÑÑ Ð¿Ð¾ÑиÑÐµÐ½Ð¸Ñ âÑÐºÐ»Ð°Ð´ÐµÐ½Ð¸Ñ â ÑимволÑв маÑÑÑ Ð²Ð»Ð°Ñний код Ñ ÑаблиÑÑ Ð®Ð½Ñкод. Ðле не вÑÑ, ÑÐ¾Ð¼Ñ Ñо Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¸Ñ ÐºÐ¾Ð¼Ð±ÑнаÑÑй занадÑо багаÑо.
Щоб пÑдÑÑимÑваÑи довÑлÑÐ½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸ÑÑÑ, ÑÑандаÑÑ Ð®Ð½Ñкод дозволÑÑ Ð½Ð°Ð¼ викоÑиÑÑовÑваÑи кÑлÑка ÑимволÑв ЮнÑкод: базовий Ñимвол, за Ñким Ñде один або декÑлÑка ÑимволÑв-познаÑок, ÑÐºÑ âпÑикÑаÑаÑÑÑâ його.
ÐапÑиклад, ÑкÑо ми маÑмо Ñимвол S, за Ñким Ñде ÑпеÑÑалÑний Ñимвол âкÑапка звеÑÑ
Ñâ (код \u0307), в пÑдÑÑÐ¼ÐºÑ Ð¼Ð¸ оÑÑимаÑмо SÌ.
alert( 'S\u0307' ); // SÌ
ЯкÑо нам поÑÑÑбна додаÑкова познаÑка над лÑÑеÑÐ¾Ñ (або пÑд неÑ) â не пÑоблема, пÑоÑÑо додайÑе Ð½ÐµÐ¾Ð±Ñ Ñдний Ñимвол познаÑки.
ÐапÑиклад, ÑкÑо ми додамо Ñимвол âкÑапка знизÑâ (код \u0323), Ñо ми маÑимемо âS з кÑапками звеÑÑ
Ñ Ñа знизÑâ: SÌÌ£.
ÐапÑиклад:
alert( 'S\u0307\u0323' ); // SÌÌ£
Це забезпеÑÑÑ Ð²ÐµÐ»Ð¸ÐºÑ Ð³Ð½ÑÑкÑÑÑÑ, але пÑи ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð½Ð¸ÐºÐ°Ñ ÑÑкава пÑоблема: два Ñимволи можÑÑÑ Ð²ÑзÑалÑно виглÑдаÑи однаково, але бÑÑи пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ ÑÑзними композиÑÑÑми ЮнÑкодÑ.
ÐапÑиклад:
let s1 = 'S\u0307\u0323'; // SÌÌ£, S + кÑапка звеÑÑ
Ñ + кÑапка знизÑ
let s2 = 'S\u0323\u0307'; // SÌ£Ì, S + кÑапка Ð·Ð½Ð¸Ð·Ñ + каÑпка звеÑÑ
Ñ
alert( `s1: ${s1}, s2: ${s2}` );
alert( s1 == s2 ); // false, Ñ
оÑа Ñимволи виглÑдаÑÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¾ (?!)
Щоб виÑÑÑиÑи ÑÑ Ð¿ÑоблемÑ, ÑÑнÑÑ Ð°Ð»Ð³Ð¾ÑиÑм âноÑмалÑзаÑÑÑ Ð®Ð½ÑкодÑâ, Ñкий пÑиводиÑÑ ÐºÐ¾Ð¶ÐµÐ½ ÑÑдок до ÑÐ´Ð¸Ð½Ð¾Ñ âноÑмалÑноÑâ ÑоÑми.
Це ÑеалÑзовÑÑÑÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ str.normalize().
alert( "S\u0307\u0323".normalize() == "S\u0323\u0307".normalize() ); // true
ЦÑкаво, Ñо в наÑÑй ÑиÑÑаÑÑÑ normalize() ÑакÑиÑно обâÑднÑÑ Ð¿Ð¾ÑлÑдовнÑÑÑÑ Ñз 3 ÑимволÑв в один: \u1e68 (S з двома кÑапками).
alert( "S\u0307\u0323".normalize().length ); // 1
alert( "S\u0307\u0323".normalize() == "\u1e68" ); // true
ÐаÑпÑавдÑ, Ñе не завжди Ñак. ÐÑиÑина в ÑомÑ, Ñо Ñимвол Ṩ Ñ âдоÑÑаÑнÑо поÑиÑенимâ, ÑÐ¾Ð¼Ñ ÑвоÑÑÑ Ð®Ð½ÑÐºÐ¾Ð´Ñ Ð²ÐºÐ»ÑÑили його в оÑÐ½Ð¾Ð²Ð½Ñ ÑаблиÑÑ Ñа дали Ð¹Ð¾Ð¼Ñ Ð¾ÐºÑемий код.
ЯкÑо ви Ñ Ð¾ÑеÑе дÑзнаÑиÑÑ Ð±ÑлÑÑе пÑо пÑавила Ñа ваÑÑанÑи ноÑмалÑзаÑÑÑ â вони опиÑÐ°Ð½Ñ Ð² додаÑÐºÑ Ð´Ð¾ ÑÑандаÑÑÑ Ð®Ð½Ñкод: Unicode Normalization Forms, але Ð´Ð»Ñ Ð±ÑлÑÑоÑÑÑ Ð¿ÑакÑиÑÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ ÑнÑоÑмаÑÑÑ Ð· ÑÑого ÑоздÑÐ»Ñ Ð´Ð¾ÑÑаÑнÑо.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)