Юникод ба кирилл үсэг: Компьютер монгол үсгийг хэрхэн «уншдаг» вэ?

Х.Буяндэлгэр
Багш

Х.Буяндэлгэр
Багш
Та хэзээ нэгэн цагт имэйл, хуучин файл эсвэл вебсайт нээгээд дараах шиг бичвэр харсан уу?
Сайн байна уу
Энэ бол нууц шифр биш. Жирийн «Сайн байна уу» гэсэн мэндчилгээ юм. Зүгээр л компьютер үсгийг буруу «дүрмээр» уншсан байна.
Компьютер үсэг мэддэггүй, зөвхөн тоо мэддэг. Тэгвэл «С» үсгийг ямар тоогоор хадгалах вэ гэдэгт хүн бүр тохиролцох хэрэгтэй. Энэ тохиролцоо олон жилийн турш эмх замбараагүй байсан бөгөөд монгол хэлэнд бүр ч хэцүү байсан. Учир нь манай цагаан толгойд орос хэлэнд байдаггүй Ө, Ү гэсэн хоёр үсэг бий.
Энэ нийтлэлээр компьютер үсгийг хэрхэн хадгалдаг, Юникод болон UTF-8 гэж юу болох, монгол үсэг яагаад заримдаа «эвдэрдэг» болохыг ярилцацгаая.

Компьютерын санах ойд «А» үсэг биш, зөвхөн 0 ба 1-ээс бүрдсэн тоо хадгалагддаг. Тиймээс үсэг бүрд дугаар оноосон хүснэгт хэрэгтэй.
Ийм хүснэгтүүдийн хамгийн алдартай нь 1963 онд АНУ-д батлагдсан ASCII юм. Энэ нь 128 тэмдэгтэд дугаар өгсөн. Жишээ нь:
A : 65
B : 66
a : 97
0 : 48
хоосон зай : 32
Та «Hi» гэж бичихэд компьютер үнэндээ 72, 105 гэсэн хоёр тоо хадгална.
Асуудал нь ASCII-д зөвхөн латин үсэг, тоо, цэг таслал багтсан явдал. Кирилл, хятад, араб үсэг, тэр байтугай франц хэлний «é» хүртэл байхгүй. 128 зай нь англи хэлэнд л хангалттай байсан.
Компьютер мэдээллийг 8 битийн байтаар хадгалдаг. Нэг байт 256 өөр утга авч чадна. ASCII зөвхөн эхний 128-ыг ашигласан тул үлдсэн 128 зай «сул» байв.
Дэлхийн улс орон бүр энэ сул зайг өөр өөрөөр дүүргэсэн. Ингэж кодын хуудас (code page) гэх олон хүснэгт бий болсон. Зөвхөн кирилл үсгийн хувьд л гэхэд KOI8-R, CP866, Windows-1251 гэх зэрэг хэд хэдэн өрсөлдөгч хүснэгт байлаа.
Бэрхшээл нь энд байв. Нэг ижил тоо өөр хүснэгтэд өөр үсэг болдог. Жишээ нь «Монгол» гэдэг үгийг Windows-1251-ээр хадгалаад, баруун Европын Windows-1252 хүснэгтээр уншвал:
Ìîíãîë
гэж харагдана. Тоо нь яг хэвээрээ, зөвхөн уншиж буй «толь бичиг» нь өөр болсон. Ийм эвдэрсэн текстийг япон үгээр mojibake (моджибаке) гэдэг.
Орос хэлэнд зориулсан Windows-1251 хүснэгтэд Ө, Ү үсэг огт байгаагүй. Тиймээс 1990–2000-аад онд Монголд тусгай фонт ашигладаг байв. Эдгээр фонт хүснэгтийн өөр, бага хэрэглэгддэг тэмдэгтийн оронд Ө, Ү-гийн дүрсийг «зурж» тавьдаг байсан.
Энэ нь гадна талаасаа зөв харагдах боловч дотоод тоо нь огт өөр тэмдэгтийнх байлаа. Тиймээс тэр фонтгүй компьютер дээр файлаа нээхэд Ө, Ү-гийн оронд хачин тэмдэгт гарч ирдэг. Хайлт, эрэмбэлэлт ч буруу ажилладаг. Гар утсаар мессеж бичихдээ олон хүн латин үсгээр «sain bnuu» гэж бичдэг байсан нь ч мөн үүнтэй холбоотой.

Олон хүснэгтийн эмх замбараагүй байдлыг зогсоохын тулд Юникод (Unicode) стандарт бий болсон. Анхны хувилбар нь 1991 онд гарсан. Санаа нь энгийн: дэлхийн бүх хэлний үсэг, тэмдэгт бүрд ганцхан, давхцахгүй дугаар оноох.
Энэ дугаарыг кодын цэг (code point) гэж нэрлээд U+ гэсэн угтвартай, 16-тын тооллоор бичдэг. Өнөөдөр Юникодод 150 мянга гаруй тэмдэгт багтсан бөгөөд латин, кирилл, хятад, араб, монгол бичиг, тэр байтугай эможи ч бий.
Кирилл үсэг U+0400-ээс U+04FF хүртэлх блокт байрладаг. Хамгийн чухал нь Ө, Ү үсэг энд өөрийн гэсэн жинхэнэ байртай болсон.
Одоо «Ө» үсэг дэлхийн аль ч компьютер дээр нэг л тоо. Тусгай фонт суулгах шаардлагагүй болсон.
Анхаарах зүйл: Юникодын эхний 128 дугаар ASCII-тэй яг адил. «A» нь ASCII-д ч, Юникодод ч 65. Тиймээс хуучин англи текстүүд эвдрэлгүй шилжиж чадсан.

Юникод нь үсэг бүрд дугаар өгдөг. Харин тэр дугаарыг файлд эсвэл интернэтээр ямар байтаар хадгалахыг кодчилол (encoding) шийддэг. Хамгийн өргөн хэрэглэгддэг кодчилол бол UTF-8 юм.
UTF-8-ийг 1992 онд Кен Томпсон, Роб Пайк нар зохиосон. Түүний ухаалаг тал нь тэмдэгт бүрд шаардлагатай хэмжээгээр л байт зарцуулдагт оршино.
Латин үсэг ASCII-тэй яг адил 1 байт эзэлдэг тул хуучин системүүдтэй зохицдог. Кирилл үсэг 2 байт эзэлдэг. Тиймээс монгол текст ижил урттай англи текстээс ойролцоогоор 2 дахин их зай эзэлнэ.
Одоо нууцыг тайлж болно. «С» үсэг UTF-8-аар D0 A1 гэсэн хоёр байт болдог. Хэрэв программ энэ хоёр байтыг хуучин Windows-1252 хүснэгтээр уншвал D0 нь «Ð», A1 нь «¡» болно. Ингээд «С» нь «Ð¡» болж хувирна. Байтууд зөв, зөвхөн уншсан хүснэгт нь буруу.
«Сайн» гэдэг үг 4 үсэгтэй боловч 8 байт эзэлж байна. Энэ ялгаа программчлалд чухал. Жишээ нь мэдээллийн санд «нэр нь 20 байтаас хэтрэхгүй» гэж хязгаарлавал англи нэр 20 үсэг багтах ч монгол нэр 10 үсэг л багтана.
Кирилл үсэг Юникодод харьцангуй хялбар багтсан. Харин уламжлалт монгол бичиг илүү том сорилт болсон. Монгол бичиг Юникодын 3.0 хувилбарт (1999 он) U+1800–U+18AF блокт орсон.
Бэрхшээл нь монгол бичгийн өвөрмөц онцлогоос үүдэлтэй:
Үсгийн хэлбэр байрлалаас хамаарч өөрчлөгддөг. Нэг үсэг үгийн эхэнд, дунд, адагт өөр өөр дүрстэй бичигддэг.
Өөр үсгүүд ижил дүрстэй байж болно. Жишээ нь зарим байрлалд «о» ба «у», «ө» ба «ү» адилхан харагддаг. Компьютер харагдах байдлаар нь биш, утгаар нь ялгах ёстой.
Босоо бичигддэг. Дээрээс доош, зүүнээс баруун тийш явдаг тул вэбсайт, программд харуулахад тусгай тохиргоо шаарддаг.
Юникод эдгээрийг шийдэхийн тулд нэг кодын цэгт нэг үсэг оноож, тухайн үсгийг ямар дүрсээр харуулахыг фонт болон программ хангамжид даатгадаг. Шаардлагатай үед хэлбэрийг тодруулах тусгай «үл харагдах» тэмдэгтүүд (variation selector) ч бий.
Энэ арга онолын хувьд зөв ч бодит байдал дээр өөр өөр фонт, программ нэг текстийг өөрөөр харуулах асуудал удаан хугацаанд үргэлжилсэн. Монгол бичгийг дижитал орчинд зөв ажиллуулах нь өнөөдөр ч хөгжүүлэгчдийн анхаарах ёстой сэдэв хэвээр байна.
Кирилл «о» ба латин «o» нүдэнд яг адилхан. Гэвч компьютерын хувьд огт өөр тэмдэгт:
print("о" == "o") # False
print(hex(ord("о"))) # 0x43e -> кирилл
print(hex(ord("o"))) # 0x6f -> латинИйм ижил дүрстэй тэмдэгтүүдийг гомоглиф (homoglyph) гэдэг. Кирилл ба латин цагаан толгойд а/a, е/e, о/o, р/p, с/c, х/x, у/y зэрэг олон хос бий.
Хэрэглэгчид хэлээ солихоо мартаад үгийн дунд латин үсэг бичих нь элбэг. Нүдэнд «Сайн» гэж харагдах ч нэг үсэг нь латин байвал хайлт тэр үгийг олохгүй, мэдээллийн санд хоёр өөр бичлэг үүсэж болно.
Халдагчид гомоглифийг хуурамч вэбсайт хийхэд ашигладаг. Жишээ нь банкны домэйн нэрийн нэг латин «а»-г кирилл «а»-гаар сольж, яг адилхан харагдах өөр хаяг бүртгүүлдэг. Үүнийг homograph attack гэдэг.
Орчин үеийн браузерууд холимог үсэгтэй домэйнийг xn-- гэж эхэлсэн тусгай хэлбэрээр (Punycode) харуулж хамгаалдаг. Гэхдээ хамгийн найдвартай хамгаалалт бол холбоос дээр дарахаасаа өмнө болгоомжтой байх явдал юм.

Үсгийн кодчиллын түүхийг нэг толь бичгийн түүхтэй зүйрлэж болно. Эхэндээ зөвхөн англи хэлний жижиг толь бичиг (ASCII) байв. Дараа нь улс бүр өөрийн толь бичгийг (кодын хуудас) зохиосон ч хоорондоо таардаггүй, монгол Ө, Ү-д бүр хуудас олдоогүй. Эцэст нь дэлхий нийт нэг том толь бичигт (Юникод) тохиролцож, түүнийг хэмнэлттэй хэвлэх аргыг (UTF-8) сонгосон.
Эвдэрсэн текст ихэнхдээ устаагүй, зүгээр л буруу хүснэгтээр уншигдсан байдаг.
Монгол үсэг UTF-8-аар 2 байт эзэлдэг тул урт.
Нүдэнд адилхан харагдах нь компьютерт адилхан гэсэн үг биш.
Бидний өдөр бүр бичдэг «ө», «ү» үсгийн цаана олон жилийн хөдөлмөр, олон улсын тохиролцоо бий. Программ бичихдээ эхнээсээ UTF-8-ийг сонгож, тэр хөдөлмөрийг үнэ цэнтэй болгоорой.