Кіріспе

Таңба кодтау схемасының түрі – компьютерлерде мәтінді сақтау.

Айнымалы ендік кодтау – бұл таңбалар жиынтығын (символдар тізімін) бейнелеу үшін әртүрлі ұзындықтағы кодтарды қолданатын таңба кодтау схемасының түрі, әдетте компьютерде. Көп таралған айнымалы ендік кодтаулар – әртүрлі таңбаларды кодтау үшін байттардың (октеттердің) әртүрлі санын пайдаланатын көпбайттық кодтаулар. (Кейбір авторлар, әсіресе Microsoft құжаттамасында, «көпбайттық таңбалар жиынтығы» терминін қолданады, бұл қате, өйткені бейнелеу көлемі таңбалар жиынтығының емес, кодтаудың қасиеті болып табылады.) Ертедегі айнымалы ендік кодтаулар, таңбасына бір байттан да аз қолданып, ағылшын мәтінін ертедегі микрокомпьютерлердегі ойындарда аз байтқа сығымдау үшін пайдаланылған. Бірақ дискілер (таспалардан айырмашылығы, кездейсоқ қол жеткізуге мүмкіндік береді, мәтінді қажет болғанда жүктеуге болады), компьютер жадының көбеюі және жалпы мақсаттағы сығымдау алгоритмдері осындай амалдарды көбінесе ескірген етіп жіберді. Көпбайттық кодтаулар көбінесе қолданыстағы шектеулермен кері үйлесімділікті бұзбай кодталатын таңбалардың санын арттыру қажеттілігінен туындайды. Мысалы, әр таңбаға бір байт (8 бит) арқылы 256 таңбаны кодтауға болады; 256 таңбадан көп кодтау үшін екі немесе одан да көп байтты әр кодтау бірлігіне пайдалану керек, екі байт (16 бит) 65 536 таңбаға мүмкіндік береді, бірақ мұндай өзгеріс қолданыстағы жүйелермен үйлесімділікті бұзуы мүмкін, сондықтан ол мүлдем орындалуы қиын.

Жалпы құрылым

Көпбайттық кодтау жүйесінің мақсаты қолданыстағы бағдарламалық жасақтамаға енгізілетін өзгерістерді азайту болғандықтан, кейбір таңбалар бұрынғы бірлік кодтарын сақтауы керек, тіпті басқа таңбалардың кодтары бірнеше бірліктен тұрса да. Осының нәтижесінде өзгермелі енді кодтауда үш түрлі бірлік кездеседі: бір бірліктен тұратын синглтон, көп бірлік тізбекте алғашқы болып келетін жетекші бірліктер және көп бірлік тізбекте кейін келетін іздеу бірліктері. Кіріс және дисплей бағдарламалық жасақтамасы, әрине, көпбайттық кодтау схемасының құрылымын білуі керек, бірақ басқа бағдарламалық жасақтама әдетте байттар жұбы екі бөлек таңбаны немесе бір таңбаны көрсететінін білуі қажет емес. Мысалы, төрт таңбадан тұратын "I♥NY" жолы UTF-8 форматында былай кодталады (гексадецималды байт мәндері түрінде көрсетілген): Бұл тізбектегі алты бірліктің 49, 4E және 59 – синглтон (I, N және Y үшін), ал қалғандары жетекші және іздеу бірліктері болып табылады. Жүрек символы жетекші бірлік пен екі іздеу бірлігінің комбинациясымен бейнеленеді. UTF-8 бағдарламаға үш түрлі бірлікті анықтауды жеңілдетеді, өйткені олар бөлек мәндер диапазонында орналасқан. Ескі өзгермелі енді кодтамалар көбінесе нашар жобаланған, себебі диапазон аймақтары үстіне жабысуы мүмкін. Осындай кодтамамен жұмыс істейтін мәтінді өңдеу бағдарламасы мәтінді дұрыс интерпретациялау үшін барлық анықталған тізбектердің басынан сканерлеуі керек. Мұндай кодтамаларда мәтіннің ортасында іздеу кезінде қате оң нәтижелерге тап болу мүмкін. Мысалы, егер DE, DF, E0 және E1 гексадецималды мәндері жетекші немесе іздеу бірліктері бола алатын болса, онда DF E0 екі бірлік тізбегін іздеу DE DF E0 E1 тізбегінде қате оң нәтиже беруі мүмкін, ол екі тізбекшенің бірінен тұрады. Сондай-ақ, бір бұзылған немесе жоғалған бірлік көп бірлік тізбектерінің үлкен бөлігінің интерпретациясын қате етуі мүмкін. Егер өзгермелі енді кодтауда барлық үш түрлі бірлік бөлек болса, тізбектерді іздеу әрқашан қате оңсыз жұмыс істейді және (егер декодер дұрыс жазылған болса) бір бірліктің бұзылуы немесе жоғалуы тек бір таңбаны бұзады.

CJK көп байт кодтамалары

Көпбайттық кодтамалар алғаш рет қытай, жапон және корей тілдерін кодтау үшін қолданылды, олардың таңбалар жиынтығы 256 таңбадан асты. Бастапқыда кодтау 7 биттік шекпен шектелген. ISO 2022 JP, ISO 2022 CN және ISO 2022 KR кодтамалары 21–7E (он алтылық) диапазонын жетекші бірліктер мен ізгі бірліктер үшін пайдаланды және оларды ISO 2022 қашқыш тізбектерін қолдану арқылы бір байттық және көп байттық режимдердің арасында ауысу арқылы жеке таңбалардан ажыратып көрсетті. Бастапқыда 8836 (94×94) таңбаны кодтауға болды, сондай-ақ 94×94 таңбадан тұратын қосымша жиынтықтарды ауыстыруға да мүмкіндік болды. CJK тілдері үшін ISO 2022 кодтау схемалары әлі де Интернетте қолданылып келеді. Бұл кодтамалардың күйлі табиғаты және үлкен қайталасуы оларды өңдеуді өте қиын етеді. Unix платформаларында ISO 2022 7 биттік кодтамалар 8 биттік кодтамалар жиынтығымен алмастырылды: кеңейтілген Unix коды – EUC JP, EUC CN және EUC KR. Көп бірлік тізбектерін және жеке таңбаларды қашқыш тізбектері арқылы ажыратудың орнына, бұл кодтамаларды күйлі еткен, көп бірлік тізбектері ең маңызды биті орнатылған арқылы белгіленді, яғни 80–FF (он алтылық) диапазонында, ал жеке таңбалар 00–7F диапазонында болды. Жетекші және ізгі бірліктер A1-ден FE-ге дейін (он алтылық) диапазонда болды, яғни ISO 2022 кодтамаларындағыдай, бірақ ең жоғары бит 1-ге орнатылған. Егер сіздің барлық шектеуіш белгілеріңіз ASCII таңбалары болса және тізбектерді белгілі бір ұзындыққа дейін қысқартудан сақтансаңыз, осы кодтамалармен жұмыс істеу оңай болды, бірақ көп байттық таңбаның ортасындағы үзіліс айқын бұрмалануға әкелуі мүмкін. PC-де (DOS және Microsoft Windows платформаларында) жапон және дәстүрлі қытай тілдері үшін екі кодтама қалыптасты: Shift JIS және Big5, оларда барлық жеке таңбалар, жетекші және ізгі бірліктер бір-бірімен жабысқан. Shift JIS-де жетекші бірліктер 81–9F және E0–FC диапазонында, ізгі бірліктер 40–7E және 80–FC диапазонында, ал жеке таңбалар 21–7E және A1–DF диапазонында болды. Big5-те жетекші бірліктер A1–FE диапазонында, ізгі бірліктер 40–7E және A1–FE диапазонында, ал жеке таңбалар 21–7E диапазонында болды (барлық мәндер он алтылық жүйеде). Бұл қайталану өңдеуді тағы да қиындатты, бірақ кем дегенде көптеген символдар бірегей байт мәндеріне ие болды (бірақ қызығы, кері қисық сызық жоқ еді).

Unicode өзгермелі ендік кодтамалары

Unicode стандартында екі өзгермелі ендік кодтамасы бар: UTF-8 және UTF-16 (сонымен қатар тұрақты ендік кодтамасы бар, UTF-32). Бастапқыда Unicode және ISO 10646 стандарттарының екеуі де ені тұрақты болуы тиіс еді, Unicode 16 биттік, ал ISO 10646 32 биттік. ISO 10646 UTF-1 деп аталатын өзгермелі ендік кодтауды ұсынды, онда жалғыз таңбалардың диапазоны 00–9F, жетекші бірліктердің диапазоны A0–FF, ал соңғы бірліктердің диапазондары A0–FF және 21–7E болды. Бұл нашар жобаланғандықтан, Shift JIS және Big5 сияқты мәндердің қабаттасуына ұқсас, Unicode-ті толығымен жүзеге асырған алғашқы Plan 9 операциялық жүйесінің жасаушылары оны тастап, Unicode үшін әлдеқайда жақсы жобаланған өзгермелі ендік кодтаумен алмастырды: UTF-8, онда жалғыз таңбалардың диапазоны 00–7F, жетекші бірліктердің диапазоны C0–FD (қазір нақтырақ айтқанда C2–F4, тым ұзын тізбектерден аулақ болу және UTF-16-ның кодтау мүмкіндігімен синхрондылықты сақтау үшін; UTF-8 мақаласын қараңыз), ал соңғы бірліктердің диапазоны 80–BF. Жетекші бірлік сондай-ақ қанша соңғы бірлік келесін көрсетеді: C2–DF кейін біреу, E0–EF кейін екеу және F0–F4 кейін үшеу. UTF-16 бастапқы Unicode-тың (1.x) 65,536 таңбалық шегінен 16 биттік кодтамамен үйлесімділікті бұзбай шығу үшін жасалды. UTF-16-да жалғыз таңбалардың диапазоны 0000–D7FF (55,296 кодтық нүкте) және E000–FFFF (8192 кодтық нүкте, барлығы 63,488), жетекші бірліктердің диапазоны D800–DBFF (1024 кодтық нүкте) және соңғы бірліктердің диапазоны DC00–DFFF (1024 кодтық нүкте, барлығы 2048). Unicode терминологиясында жоғары суррогат және төмен суррогат деп аталатын жетекші және соңғы бірліктер 1024×1024 немесе 1,048,576 қосымша таңбаны бейнелейді, бұл 1,112,064 (63,488 BMP кодтық нүктесі + 1,048,576 кодтық нүкте, жоғары және төмен суррогат жұптарымен көрсетілген) кодталатын кодтық нүктелер немесе Unicode тілінде скалярлық мәндер (суррогаттар кодталмайды).