Айнымалы енділік кодтау схемасы – компьютерде мәтінді сақтау тәсілі. Әртүрлі символдарды кодтау үшін әртүрлі ұзындықтағы кодтар қолданылады. Көбінесе көпбайтты кодтаулар пайдаланылады.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Таңба кодтау схемасының түрі – компьютерлерде мәтінді сақтау.
Type of character encoding scheme
the storage of text in computers
Айнымалы ендік кодтау – бұл таңбалар жиынтығын (символдар тізімін) бейнелеу үшін әртүрлі ұзындықтағы кодтарды қолданатын таңба кодтау схемасының түрі, әдетте компьютерде. Көп таралған айнымалы ендік кодтаулар – әртүрлі таңбаларды кодтау үшін байттардың (октеттердің) әртүрлі санын пайдаланатын көпбайттық кодтаулар. (Кейбір авторлар, әсіресе Microsoft құжаттамасында, «көпбайттық таңбалар жиынтығы» терминін қолданады, бұл қате, өйткені бейнелеу көлемі таңбалар жиынтығының емес, кодтаудың қасиеті болып табылады.) Ертедегі айнымалы ендік кодтаулар, таңбасына бір байттан да аз қолданып, ағылшын мәтінін ертедегі микрокомпьютерлердегі ойындарда аз байтқа сығымдау үшін пайдаланылған. Бірақ дискілер (таспалардан айырмашылығы, кездейсоқ қол жеткізуге мүмкіндік береді, мәтінді қажет болғанда жүктеуге болады), компьютер жадының көбеюі және жалпы мақсаттағы сығымдау алгоритмдері осындай амалдарды көбінесе ескірген етіп жіберді. Көпбайттық кодтаулар көбінесе қолданыстағы шектеулермен кері үйлесімділікті бұзбай кодталатын таңбалардың санын арттыру қажеттілігінен туындайды. Мысалы, әр таңбаға бір байт (8 бит) арқылы 256 таңбаны кодтауға болады; 256 таңбадан көп кодтау үшін екі немесе одан да көп байтты әр кодтау бірлігіне пайдалану керек, екі байт (16 бит) 65 536 таңбаға мүмкіндік береді, бірақ мұндай өзгеріс қолданыстағы жүйелермен үйлесімділікті бұзуы мүмкін, сондықтан ол мүлдем орындалуы қиын.
A variable width encoding is a type of character encoding scheme in which codes of differing lengths are used to encode a character set (a repertoire of symbols) for representation, usually in a computer. Most common variable width encodings are multibyte encodings, which use varying numbers of bytes (octets) to encode different characters. (Some authors, notably in Microsoft documentation, use the term multibyte character set, which is a misnomer, because representation size is an attribute of the encoding, not of the character set.) Early variable width encodings using less than a byte per character were sometimes used to pack English text into fewer bytes in adventure games for early microcomputers. However disks (which unlike tapes allowed random access allowing text to be loaded on demand), increases in computer memory and general purpose compression algorithms have rendered such tricks largely obsolete. Multibyte encodings are usually the result of a need to increase the number of characters which can be encoded without breaking backward compatibility with an existing constraint. For example, with one byte (8 bits) per character, one can encode 256 possible characters; in order to encode more than 256 characters, the obvious choice would be to use two or more bytes per encoding unit, two bytes (16 bits) would allow 65,536 possible characters, but such a change would break compatibility with existing systems and therefore might not be feasible at all.
Жалпы құрылым
Көпбайттық кодтау жүйесінің мақсаты қолданыстағы бағдарламалық жасақтамаға енгізілетін өзгерістерді азайту болғандықтан, кейбір таңбалар бұрынғы бірлік кодтарын сақтауы керек, тіпті басқа таңбалардың кодтары бірнеше бірліктен тұрса да. Осының нәтижесінде өзгермелі енді кодтауда үш түрлі бірлік кездеседі: бір бірліктен тұратын синглтон, көп бірлік тізбекте алғашқы болып келетін жетекші бірліктер және көп бірлік тізбекте кейін келетін іздеу бірліктері. Кіріс және дисплей бағдарламалық жасақтамасы, әрине, көпбайттық кодтау схемасының құрылымын білуі керек, бірақ басқа бағдарламалық жасақтама әдетте байттар жұбы екі бөлек таңбаны немесе бір таңбаны көрсететінін білуі қажет емес. Мысалы, төрт таңбадан тұратын "I♥NY" жолы UTF-8 форматында былай кодталады (гексадецималды байт мәндері түрінде көрсетілген): Бұл тізбектегі алты бірліктің 49, 4E және 59 – синглтон (I, N және Y үшін), ал қалғандары жетекші және іздеу бірліктері болып табылады. Жүрек символы жетекші бірлік пен екі іздеу бірлігінің комбинациясымен бейнеленеді. UTF-8 бағдарламаға үш түрлі бірлікті анықтауды жеңілдетеді, өйткені олар бөлек мәндер диапазонында орналасқан. Ескі өзгермелі енді кодтамалар көбінесе нашар жобаланған, себебі диапазон аймақтары үстіне жабысуы мүмкін. Осындай кодтамамен жұмыс істейтін мәтінді өңдеу бағдарламасы мәтінді дұрыс интерпретациялау үшін барлық анықталған тізбектердің басынан сканерлеуі керек. Мұндай кодтамаларда мәтіннің ортасында іздеу кезінде қате оң нәтижелерге тап болу мүмкін. Мысалы, егер DE, DF, E0 және E1 гексадецималды мәндері жетекші немесе іздеу бірліктері бола алатын болса, онда DF E0 екі бірлік тізбегін іздеу DE DF E0 E1 тізбегінде қате оң нәтиже беруі мүмкін, ол екі тізбекшенің бірінен тұрады. Сондай-ақ, бір бұзылған немесе жоғалған бірлік көп бірлік тізбектерінің үлкен бөлігінің интерпретациясын қате етуі мүмкін. Егер өзгермелі енді кодтауда барлық үш түрлі бірлік бөлек болса, тізбектерді іздеу әрқашан қате оңсыз жұмыс істейді және (егер декодер дұрыс жазылған болса) бір бірліктің бұзылуы немесе жоғалуы тек бір таңбаны бұзады.
Since the aim of a multibyte encoding system is to minimise changes to existing application software, some characters must retain their pre existing single unit codes, even while other characters have multiple units in their codes. The result is that there are three sorts of units in a variable width encoding: singletons, which consist of a single unit, lead units, which come first in a multiunit sequence, and trail units, which come afterwards in a multiunit sequence. Input and display software obviously needs to know about the structure of the multibyte encoding scheme, but other software generally doesn't need to know if a pair of bytes represent two separate characters or just one character. For example, the four character string "I♥NY" is encoded in UTF 8 like this (shown as hexadecimal byte values): Of the six units in that sequence, 49, 4E, and 59 are singletons (for I, N, and Y), is a lead unit and and are trail units. The heart symbol is represented by the combination of the lead unit and the two trail units. UTF 8 makes it easy for a program to identify the three sorts of units, since they fall into separate value ranges. Older variable width encodings are typically not as well designed, since the ranges may overlap. A text processing application that deals with the variable width encoding must then scan the text from the beginning of all definitive sequences in order to identify the various units and interpret the text correctly. In such encodings, one is liable to encounter false positives when searching for a string in the middle of the text. For example, if the hexadecimal values DE, DF, E0, and E1 can all be either lead units or trail units, then a search for the two unit sequence DF E0 can yield a false positive in the sequence DE DF E0 E1, which consists of two consecutive two unit sequences. There is also the danger that a single corrupted or lost unit may render the whole interpretation of a large run of multiunit sequences incorrect. In a variable width encoding where all three types of units are disjunct, string searching always works without false positives, and (provided the decoder is well written) the corruption or loss of one unit corrupts only one character.
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 диапазонында болды (барлық мәндер он алтылық жүйеде). Бұл қайталану өңдеуді тағы да қиындатты, бірақ кем дегенде көптеген символдар бірегей байт мәндеріне ие болды (бірақ қызығы, кері қисық сызық жоқ еді).
The first use of multibyte encodings was for the encoding of Chinese, Japanese and Korean, which have large character sets well in excess of 256 characters. At first the encoding was constrained to the limit of 7 bits. The ISO 2022 JP, ISO 2022 CN and ISO 2022 KR encodings used the range 21–7E (hexadecimal) for both lead units and trail units, and marked them off from the singletons by using ISO 2022 escape sequences to switch between single byte and multibyte mode. A total of 8,836 (94×94) characters could be encoded at first, and further sets of 94×94 characters with switching. The ISO 2022 encoding schemes for CJK are still in use on the Internet. The stateful nature of these encodings and the large overlap make them very awkward to process. On Unix platforms, the ISO 2022 7 bit encodings were replaced by a set of 8 bit encoding schemes, the Extended Unix Code: EUC JP, EUC CN and EUC KR. Instead of distinguishing between the multiunit sequences and the singletons with escape sequences, which made the encodings stateful, multiunit sequences were marked by having the most significant bit set, that is, being in the range 80–FF (hexadecimal), while the singletons were in the range 00–7F alone. The lead units and trail units were in the range A1 to FE (hexadecimal), that is, the same as their range in the ISO 2022 encodings, but with the high bit set to 1. These encodings were reasonably easy to work with provided all your delimiters were ASCII characters and you avoided truncating strings to fixed lengths, but a break in the middle of a multibyte character could still cause major corruption. On the PC (DOS and Microsoft Windows platforms), two encodings became established for Japanese and Traditional Chinese in which all of singletons, lead units and trail units overlapped: Shift JIS and Big5 respectively. In Shift JIS, lead units had the range 81–9F and E0–FC, trail units had the range 40–7E and 80–FC, and singletons had the range 21–7E and A1–DF. In Big5, lead units had the range A1–FE, trail units had the range 40–7E and A1–FE, and singletons had the range 21–7E (all values in hexadecimal). This overlap again made processing tricky, though at least most of the symbols had unique byte values (though strangely the backslash does not).
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 тілінде скалярлық мәндер (суррогаттар кодталмайды).
The Unicode standard has two variable width encodings: UTF 8 and UTF 16 (it also has a fixed width encoding, UTF 32). Originally, both the Unicode and ISO 10646 standards were meant to be fixed width, with Unicode being 16 bit and ISO 10646 being 32 bit. ISO 10646 provided a variable width encoding called UTF 1, in which singletons had the range 00–9F, lead units the range A0–FF and trail units the ranges A0–FF and 21–7E. Because of this bad design, similar to Shift JIS and Big5 in its overlap of values, the inventors of the Plan 9 operating system, the first to implement Unicode throughout, abandoned it and replaced it with a much better designed variable width encoding for Unicode: UTF 8, in which singletons have the range 00–7F, lead units have the range C0–FD (now actually C2–F4, to avoid overlong sequences and to maintain synchronism with the encoding capacity of UTF 16; see the UTF 8 article), and trail units have the range 80–BF. The lead unit also tells how many trail units follow: one after C2–DF, two after E0–EF and three after F0–F4. UTF 16 was devised to break free of the 65,536 character limit of the original Unicode (1. x) without breaking compatibility with the 16 bit encoding. In UTF 16, singletons have the range 0000–D7FF (55,296 code points) and E000–FFFF (8192 code points, 63,488 in total), lead units the range D800–DBFF (1024 code points) and trail units the range DC00–DFFF (1024 code points, 2048 in total). The lead and trail units, called high surrogates and low surrogates, respectively, in Unicode terminology, map 1024×1024 or 1,048,576 supplementary characters, making 1,112,064 (63,488 BMP code points + 1,048,576 code points represented by high and low surrogate pairs) encodable code points, or scalar values in Unicode parlance (surrogates are not encodable).