ÐÑÐ¾Ñ Ñаздел более подÑобно опиÑÑваеÑ, как ÑÑÑÑÐ¾ÐµÐ½Ñ ÑÑÑоки. Такие Ð·Ð½Ð°Ð½Ð¸Ñ Ð¿ÑигодÑÑÑÑ, еÑли Ð²Ñ Ð½Ð°Ð¼ÐµÑÐµÐ½Ñ ÑабоÑаÑÑ Ñ Ñмодзи, Ñедкими маÑемаÑиÑеÑкими Ñимволами, иеÑоглиÑами, и Ñ.д.
Ðак Ð¼Ñ Ñже знаем, ÑÑÑоки в 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, MATHEMATICAL SCRIPT CAPITAL X
alert( 'ð'.length ); // 2, FACE WITH TEARS OF JOY
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, 4), Ð¼Ñ Ð½Ðµ можем гаÑанÑиÑоваÑÑ Ð²Ð°Ð»Ð¸Ð´Ð½Ð¾ÑÑÑ Ð¿Ð¾Ð»ÑÑенного знаÑениÑ. ÐапÑимеÑ:
alert( 'hi ð'.slice(0, 4) ); // hi [?]
ÐдеÑÑ Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼ мÑÑоÑнÑй Ñимвол (пеÑÐ²Ð°Ñ Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ð° ÑÑÑÑогаÑной паÑÑ ð) в вÑводе.
ÐÑоÑÑо имейÑе ÑÑо в видÑ, еÑли Ð²Ñ Ð½Ð°Ð¼ÐµÑÐµÐ½Ñ Ð½Ð°Ð´ÐµÐ¶Ð½Ð¾ ÑабоÑаÑÑ Ñ ÑÑÑÑогаÑнÑми паÑами. ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ, ÑÑо не оÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑÐ°Ñ Ð¿Ñоблема, но, по кÑайней меÑе, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÑÑ, ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ.
ÐиакÑиÑиÑеÑкие знаки и ноÑмализаÑиÑ
Ðо Ð¼Ð½Ð¾Ð³Ð¸Ñ ÑзÑÐºÐ°Ñ ÐµÑÑÑ ÑимволÑ, ÑоÑÑоÑÑие из оÑновного Ñимвола и знака над/под ним.
ÐапÑимеÑ, бÑква a Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ñновой Ð´Ð»Ñ ÑÑиÑ
Ñимволов: à áâäãåÄ.
ÐолÑÑинÑÑво ÑаÑпÑоÑÑÑаненнÑÑ Â«ÑоÑÑавнÑÑ Â» Ñимволов имеÑÑ Ñвой ÑобÑÑвеннÑй код в ÑаблиÑе Юникода. Ðо не вÑе, поÑÐ¾Ð¼Ñ ÑÑо ÑÑÑеÑÑвÑÐµÑ ÑлиÑком болÑÑое колиÑеÑÑво возможнÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñий.
ÐÐ»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки лÑбÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñий ÑÑандаÑÑ Ð®Ð½Ð¸ÐºÐ¾Ð´ позволÑÐµÑ Ð½Ð°Ð¼ иÑполÑзоваÑÑ Ð½ÐµÑколÑко ЮникоднÑÑ Ñимволов: оÑновной Ñимвол, за коÑоÑÑм ÑледÑÐµÑ Ð¾Ð´Ð¸Ð½ или много Ñимволов-«меÑок», коÑоÑÑе «ÑкÑаÑаÑÑ» его.
ÐапÑимеÑ, еÑли за S ÑледÑÐµÑ ÑпеÑиалÑнÑй Ñимвол «ÑоÑка ÑвеÑÑ
Ñ» (код \u0307), Ñо он оÑобÑазиÑÑÑ ÐºÐ°Ðº á¹ .
alert( 'S\u0307' ); // SÌ
ÐÑли нам нÑжен дополниÑелÑнÑй знак над бÑквой (или под ней) â Ð½ÐµÑ Ð¿Ñоблем, пÑоÑÑо добавлÑем ÑооÑвеÑÑÑвÑÑÑий Ñимвол.
ÐапÑимеÑ, еÑли Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð¼ Ñимвол «ÑоÑка ÑнизÑ» (код \u0323), Ñо полÑÑим «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() «ÑÑ
лопÑваеÑ» поÑледоваÑелÑноÑÑÑ Ð¸Ð· ÑÑÑÑ
Ñимволов в один: \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â¦)