Кіріспе
Unicode-тың ASCII-ге үйлесімді өзгермелі енді кодтау, бірден төрт байтты пайдаланады. UTF-8 – электрондық байланыс үшін қолданылатын өзгермелі ұзындықтағы таңба кодтау стандарты. Unicode стандартымен анықталған, атауы Unicode Transformation Format 8 биттен алынған. UTF-8 бір байттық (8 бит) код бірліктерін пайдаланып, барлық 1,112,064 жарамды Unicode код нүктелерін кодтай алады. Төмен сандық мәндерге ие код нүктелері, көбірек кездесетіндері, аз байттарды пайдаланып кодталады. Ол ASCII-мен кері үйлесімділік үшін жасалған: Unicode-тың алғашқы 128 таңбасы, ASCII-мен бір-біріне сәйкес келетіндері, ASCII-мен бірдей бинарлық мәні бар бір байтпен кодталады, сондықтан жарамды ASCII мәтіні жарамды UTF-8 кодталған Unicode болып табылады. UTF-8, UTF-1-ге жақсы балама ретінде жасалған, ол ASCII-ге ішінара үйлесімділігі бар өзгермелі ұзындықтағы кодтау, онда өзін-өзі синхрондау және слэш сияқты таңбаларды ASCII-ге толық үйлесімді өңдеу сияқты кейбір мүмкіндіктер болмаған. Кен Томпсон мен Роб Пайк 1992 жылдың қыркүйегінде Plan 9 операциялық жүйесі үшін алғашқы нұсқасын жасады. Бұл X/Open-нің FSS UTF-ге арналған спецификациясын қабылдауына әкелді, ол алғаш рет 1993 жылдың қаңтарында USENIX-те ресми түрде ұсынылды, кейіннен Интернет Инженерлік Тобы (IETF) болашақ интернет стандарттары жұмысы үшін RFC 2277 (BCP 18) ретінде қабылдады, бұл ескі RFC-лердегі Latin 1 сияқты бір байттық таңба жиынтықтарын ығыстырды. UTF-8 халықаралық мәселелерді азайтады. Ресми Интернетке тағайындалған нөмірлер органы csUTF8-ті жалғыз псевдоним ретінде тізімдейді, ол сирек қолданылады. Windows-та UTF-8 – codepage 65001 (яғни CP UTF8 бастапқы кодта). MySQL-де UTF-8 utf8mb4 деп аталады (utf8mb3 және оның псевдонимдері utf8, негізгі көптілді жазықтықтағы таңбалар үшін кіші жиынтық кодтау). HP PCL-де UTF-8 үшін символ ID 18N болып табылады. Oracle деректер базасында (9.0 нұсқасынан бастап) AL32UTF8 UTF-8 дегенді білдіреді. Сондай-ақ, UTF-8 синонимімен сирек қолданылуы керек CESU 8 қараңыз. UTF-8 BOM және UTF-8 NOBOM кейде байт реті белгісін (BOM) қамтитын немесе қамтымайтын мәтіндік файлдар үшін қолданылады. Әсіресе Жапонияда BOM-сыз UTF-8 кодтамасы кейде UTF-8N деп аталады.
UTF 8 is a variable length character encoding standard used for electronic communication. Defined by the Unicode Standard, the name is derived from Unicode Transformation Format 8 bit. UTF 8 is capable of encoding all 1,112,064 valid Unicode code points using one to four one byte (8 bit) code units. Code points with lower numerical values, which tend to occur more frequently, are encoded using fewer bytes. It was designed for backward compatibility with ASCII: the first 128 characters of Unicode, which correspond one to one with ASCII, are encoded using a single byte with the same binary value as ASCII, so that valid ASCII text is valid UTF 8 encoded Unicode as well. UTF 8 was designed as a superior alternative to UTF 1, a proposed variable length encoding with partial ASCII compatibility which lacked some features including self synchronization and fully ASCII compatible handling of characters such as slashes. Ken Thompson and Rob Pike produced the first implementation for the Plan 9 operating system in September 1992. This led to its adoption by X/Open as its specification for FSS UTF, which would first be officially presented at USENIX in January 1993 and subsequently adopted by the Internet Engineering Task Force (IETF) in RFC 2277 (BCP 18) for future internet standards work, replacing Single Byte Character Sets such as Latin 1 in older RFCs. UTF 8 results in fewer internationalization issues Spellings with a space e. g. "UTF 8" should not be used. The official Internet Assigned Numbers Authority also lists csUTF8 as the only alias, which is rarely used. In Windows, UTF 8 is codepage 65001 (i. e. CP UTF8 in source code). In MySQL, UTF 8 is called utf8mb4 (with utf8mb3, and its alias utf8, being a subset encoding for characters in the Basic Multilingual Plane). In HP PCL, the Symbol ID for UTF 8 is 18N. In Oracle Database (since version 9.0), AL32UTF8 means UTF 8. See also CESU 8 for an almost synonym with UTF 8 that rarely should be used. UTF 8 BOM and UTF 8 NOBOM are sometimes used for text files which contain or do not contain a byte order mark (BOM), respectively. In Japan especially, UTF 8 encoding without a BOM is sometimes called UTF 8N.
Код бетінің макетін құру
Келесі кесте код беті форматында UTF-8 код бірліктерінің (жеке байттар немесе октеттер) қолданылуын қамтиды. Жоғарғы жартысы бір ғана байтты кодтарда қолданылатын байттарға арналған, сондықтан ол әдеттегі код беті сияқты көрінеді; ал төменгі жартысы жалғастыру байттары мен бастапқы байттар үшін пайдаланылады және оның толық түсіндірмесі төмендегі түсіндірмелерде келтірілген.
Ұзақ кодтамалар
Принцип бойынша, кодтау нүктесіне алдынан 0-дер қосып толтыру арқылы кодтаудағы байттар санын арттыру мүмкін. Мысалы, жоғарыда келтірілген € евро белгісін үш байттың орнына төрт байтпен кодтау үшін, оны 21 битке дейін толтырып, (немесе он алтылық жүйеде ) деп кодтауға болады. Бұл – артық ұзын кодтау. Стандартта кодтау нүктесінің дұрыс кодталуы, кодтау нүктесінің маңызды биттерін сақтау үшін қажетті ең аз байттар санын ғана пайдалану керектігі көрсетілген. Ұзақ кодтамалар артық ұзын деп аталады және олар кодтау нүктесінің жарамды UTF-8 ұсыныстары болып табылмайды. Бұл ереже кодтау нүктелері мен олардың жарамды кодтамалары арасында бір-бірге сәйкестік сақтайды, сондықтан әрбір кодтау нүктесі үшін бірегей жарамды кодтама бар. Бұл жолдарды салыстыру және іздеудің дұрыс анықталғанын қамтамасыз етеді.
, and encoded as (or in hexadecimal). This is called an overlong encoding. The standard specifies that the correct encoding of a code point uses only the minimum number of bytes required to hold the significant bits of the code point. Longer encodings are called overlong and are not valid UTF 8 representations of the code point. This rule maintains a one to one correspondence between code points and their valid encodings, so that there is a unique valid encoding for each code point. This ensures that string comparisons and searches are well defined.
Бала асырап алу
UTF-8 2008 жылдан бері World Wide Web-тің ең көп қолданылатын кодировкасы болып табылады. 2024 жылғы мәліметтер бойынша, зерттелген веб-сайттардың 98,2%-ы UTF-8 қолданады. Сонымен қатар, "UTF-16 [ ] – бірнеше платформаны қолдайтын кодты жазатын бағдарламашыларға Windows жүктететін ерекше қиындық" делінеді.
Бір байтты
UTF 8 кез келген Юникод символын кодтай алады, бұл «код бетін» анықтау және орнату қажеттілігін жояды немесе қолданылып жатқан таңбалар жиынтығын көрсетуді болдырмайды, сонымен қатар бір уақытта бірнеше жазу жүйесінде шығаруға мүмкіндік береді. Көптеген жазу жүйелері үшін бір байттан артық кодтаулар қолданылған, сондықтан жазу жүйесін білу ғана оны дұрыс көрсету үшін жеткіліксіз ақпарат болды. 0xFE және 0xFF байттары пайда болмайды, сондықтан жарамды UTF 8 ағыны ешқашан UTF 16 байт реті белгісіне (BOM) сәйкес келмейді және осылайша оны осымен шатастыру мүмкін емес. 0xFF (0377) болмауы Telnet-те (және FTP басқару байланысында) осы байтты эскейптеу қажеттілігін де жояды. UTF 8 кодталған мәтін, қарапайым ASCII символдарын қоспағанда, арнайы бір байттық кодтамалардан үлкен. 8 биттік таңбалар жиынтығын пайдаланған жазу жүйелерінде (мысалы, кириллица және грек әліпбиінің кодтары), жоғарғы жартысында латын емес таңбалармен кодталғанда, UTF 8 символы екі есе үлкен болады. Кейбір жазу жүйелері, мысалы тай және деванагари (Оңтүстік Азияның әртүрлі тілдері қолданады), символы үш есе үлкен болады. Тіпті бір байт Юникодта күрделі символға айналып, UTF 8-де алты есе үлкен болатын мысалдар да бар. Бұл Үндістанда және басқа елдерде наразылық тудырды. UTF 8 (немесе кез келген басқа көп байттық кодтау) арқылы символдың ортасында жолдарды бөлуге немесе қысқартуға болады. Егер екі бөлік кейінірек символ ретінде интерпретацияланбас бұрын қайта біріктірілмесе, бұл бұрынғы бөлімнің соңында да, келесі бөлімнің басында да жарамсыз тізбекке әкелуі мүмкін, ал кейбір декодерлер осы байттарды сақтап қалмайды және деректердің жоғалуына себеп болады. Бірақ UTF 8 өзін-өзі синхрондауға қабілетті болғандықтан, бұл ешқашан басқа жарамды символды енгізбейді, сонымен қатар кесу нүктесін символдың басына кері жылжыту өте оңай. Егер кодтық нүктелердің барлығы бірдей өлшемде болса, олардың белгілі бір санын өлшеу оңай. ASCII дәуіріндегі құжаттамада «символ» сөзі «байт» сөзімен синоним ретінде қолданылғандықтан, бұл маңызды деп есептеледі. Дегенмен, «символдардың» орнына байттарды қолдана отырып, жол позицияларын өлшеу арқылы көптеген алгоритмдерді UTF 8 үшін оңай және тиімді бейімдеуге болады. Мысалы, ұзын жолдың ішіндегі жолды байт бойынша байт іздеуге болады; өзін-өзі синхрондау қасиеті жалған оң нәтижелерді болдырмайды.
Басқа көп байтты
UTF-8 кез келген Юникод символын кодтай алады. Әртүрлі жазу жүйелеріндегі файлдарды дұрыс код бетін немесе шрифті таңдау қажеттілігінсіз дұрыс көрсетуге болады. Мысалы, қытай және араб тілдері арнайы белгілеулерсіз немесе кодтауды анықтайтын қолмен орнатуларсыз бір файлда жазылуы мүмкін. UTF-8 өзін-өзі синхрондауға қабілетті: символ шекараларын екі бағытта да анықталған бит үлгілерін сканерлеу арқылы оңай табуға болады. Егер қате немесе зақымдану салдарынан байттар жоғалса, келесі жарамды символды табуға және өңдеуді жалғастыруға болады. Егер белгілі бір өріске сәйкес келу үшін жолды қысқарту қажет болса, бұрынғы жарамды символ оңай табылады. Shift JIS сияқты көптеген көп байттық кодтамаларды қайта синхрондау әлдеқайда қиын. Бұл сонымен қатар, UTF-8-де (символ сол байт санынан тұратын "сөз" сияқты) байтқа бағытталған жол іздеу алгоритмдерін қолдануға болады, байт іздеудің оңтайландырылған нұсқалары аппараттық қолдау және 256 жазбасы бар іздеу кестелерінің арқасында әлдеқайда жылдам болуы мүмкін. Дегенмен, өзін-өзі синхрондау үшін әр байтта осы маркерлерге арналған биттерді резервтеу қажет, бұл оның көлемін арттырады. Қарапайым биттік операцияларды қолдану арқылы кодтау тиімді. UTF-8 көбейту немесе бөлу сияқты баяу математикалық операцияларды қажет етпейді (Shift JIS, GB 2312 және басқа кодтамалардан өзгеше). UTF-8 белгілі бір жазу жүйесі үшін жасалған көп байттық кодтамаға қарағанда көбірек орын алады. Шығыс Азияның ескі кодтамалары әдетте бір символға екі байт жұмсайды, ал UTF-8 бір символға үш байт жұмсайды.
UTF-16
Байт кодтамалары мен UTF-8 бағдарламаларда байт массивтері арқылы бейнеленеді, және байт кодтамасынан UTF-8 кодтамасына түрлендіру кезінде функцияға ешқандай өзгеріс енгізудің қажеті жоқ. UTF-16 16 биттік сөз массивтерімен бейнеленеді, ал UTF-16-ға түрлендіру, егер қолданыстағы ASCII негізделген бағдарламалармен (Windows-та жасалғандай) үйлесімділікті сақтау қажет болса, әрбір API және дерек құрылымын екі нұсқада жасауды талап етеді: бірі байт тізбектерін, екіншісі UTF-16 тізбектерін қабылдайды. Егер артқа қарай үйлесімділік қажет болмаса, барлық тізбектерді өңдеу әдістерін өзгерту қажет. UTF-8 кодталған мәтін, егер U+0080 төмен кодтық таңбалар U+0800–U+FFFF аралығындағылардан көп болса, UTF-16 кодталған мәтіннен кіші болады. Бұл барлық заманауи еуропалық тілдерге қатысты. Көп жағдайда бұл қытай тілі сияқты тілдерге де қатысты, себебі әдеттегі файлдарда көптеген бос орындар, жаңа жолдар, сандар және HTML белгілері болады. Байланыс (мысалы, HTML және IP) және сақтау (мысалы, Unix үшін) жүйелерінің көпшілігі байттар ағыны үшін жасалған. UTF-16 тізбегі әрбір код бірлігі үшін екі байтты пайдалануы керек: осы екі байттың реті маңызды болады және UTF-16 протоколында, мысалы, байт реті белгісі (BOM) арқылы көрсетілуі тиіс. Егер UTF-16 тізбегінен тақ саны байт жоғалса, тізбектің қалған бөлігі мағынасыз болады. UTF-8 тізбегінен жоғалған байттар жоғалған байттардан кейінгі келесі таңбадан бастап мәтінді дәл қалпына келтіруге мүмкіндік береді.
The order of those two bytes becomes an issue and must be specified in the UTF 16 protocol, such as with a byte order mark (BOM). If an odd number of bytes is missing from UTF 16, the whole rest of the string will be meaningless text. Any bytes missing from UTF 8 will still allow the text to be recovered accurately starting with the next character after the missing bytes.
Деривативтер
Келесі іске асырулар UTF-8 спецификациясынан шамалы өзгешеліктерді көрсетеді. Олар UTF-8 спецификациясына үйлесімді емес және осы спецификацияға сәйкес келетін қолданбалар оларды қабылдамауы мүмкін.
CESU-8
Unicode Technical Report #26 UTF 8 стандарты емес түріне CESU 8 атауын береді, онда қосымша жазықтықтағы Unicode таңбалары UTF 8 талап ететін төрт байт емес, алты байтпен кодталады. CESU 8 кодтамасы төрт байттық UTF 16 жұптарының әр жартысын екі байттық UCS 2 таңбасы ретінде қарастырады, нәтижесінде екі үш байттық UTF 8 таңбасы пайда болады, олар бірге бастапқы қосымша таңбаны көрсетеді. Негізгі көптілді жазықтықтағы Unicode таңбалары UTF 8-де әдеттегідей көрінеді. Бұл есеп Юникод консорциумы оны қолдануды ұсынбаса да, CESU 8 ретінде кодталған деректердің бар екенін мойындау және ресмилеу үшін жазылды, сондай-ақ CESU 8 кодтамасының мақсатты себебі UTF 16 бинарлық ретін сақтау болуы мүмкін екенін атап өтті. CESU 8 кодтамасы UTF 16 қосымша таңбалары бар деректерді UCS 2 деректерін деп есептейтін түрлендіру әдістерін қолдана отырып UTF 16-дан UTF 8-ге түрлендіру нәтижесінде туындауы мүмкін, яғни олар UTF 16-ның төрт байттық қосымша таңбаларын білмейді. Бұл мәселе негізінен Microsoft Windows сияқты UTF 16 ішкі жүйеде кеңінен қолданылатын операциялық жүйелерде кездеседі. Oracle деректер базасында таңбалар жиынтығы CESU 8 кодтамасын пайдаланады және ол қолданудан шығарылған. Таңбалар жиынтығы стандартқа сәйкес келетін UTF 8 кодтамасын пайдаланады және оған басымдық беріледі. CESU 8 HTML5 құжаттарында қолдануға тыйым салынған.
MySQL utf8mb3
MySQL-де таңбалар жиынтығы UTF-8 кодталған деректер ретінде анықталады, онда әр таңбаға ең көп үш байттан орын бөлінеді, яғни тек Негізгі көптілді жазықтықтағы (яғни UCS-2) Юникод таңбалары қолдауға ие. Қосымша жазықтықтағы Юникод таңбаларына қолдау көрсетілмейді. бұл, стандартқа сәйкес келетін UTF-8 кодтамасын пайдаланатын таңбалар жиынтығының пайдасына ескірген. -тің синонимі болып табылады, бірақ MySQL-дің болашақ нұсқасында -тің синонимі болуы тиіс. Өзгертілген UTF-8 жолдарында нақты нөлдік байттар болмайды, бірақ U+0000-ды қоса алғанда, барлық Юникод кодтық ұпайларын қамти алады, бұл мұндай жолдарды (бір нөлдік байт қосылған) дәстүрлі нөлдік жолдармен жұмыс істейтін функциялармен өңдеуге мүмкіндік береді. Белгілі барлық Өзгертілген UTF-8 жүзеге асырулары да орнын алмастыру жұптарын CESU-8 сияқты қарастырады. Әдеттегі қолдануда, тіл стандартты UTF-8-ді жолдарды оқу және жазу кезінде қолданады (егер ол платформаның әдепкі таңбалар жиынтығы болса немесе бағдарлама талап еткен жағдайда). Дегенмен, ол объектілерді сериалдау және Java Native Interface үшін, сондай-ақ сынып файлдарына тұрақты жолдарды ендіру үшін Өзгертілген UTF-8-ді пайдаланады. Dalvik анықтаған dex форматы да жол мәндерін көрсету үшін бірдей өзгертілген UTF-8-ді қолданады. Tcl де Юникод деректерін ішкі түрде бейнелеу үшін Java сияқты бірдей өзгертілген UTF-8-ді пайдаланады, бірақ сыртқы деректер үшін қатаң CESU-8-ді қолданады.
WTF-8
WTF 8 (Wobbly Transformation Format, 8 bit) форматында жұптаспаған орнатқыш жартыларына (U+D800-ден U+DFFF-қа дейін) рұқсат етіледі. Бұл Windows файлдарын сияқты мүмкін жарамсыз UTF-16 сақтау үшін қажет. UTF-8пен жұмыс істейтін көптеген жүйелер оны басқа кодтау деп санамай, осылай жұмыс істейді, себебі бұл оңайырақ. "WTF 8" термині кейде қателікпен екі рет кодталған UTF-8-ге, сонымен қатар CP1252 байттары ғана кодталған деген оймен әзілдеп сілтеме жасау үшін қолданылады.
PEP 383
Python бағдарламалау тілінің 3-ші нұсқасы жарамсыз UTF-8 байт ағынының әрбір байтын қате ретінде қарастырады (сонымен қатар Python 3.7-дегі жаңа UTF-8 режиміне енгізілген өзгерістерді қараңыз); бұл 128 түрлі мүмкін қатеге әкеледі. UTF-8 деп есептелетін кез келген байт тізбегін жоғалтусыз UTF-16 немесе UTF-32 форматына түрлендіруге мүмкіндік беретін кеңейтулер жасалды, осы арқылы 128 мүмкін қате байт 128 кодтық нүктеге аударылып, кейін олар қате байттарға айналдырылып, UTF-8 шығарылады. Ең көп қолданылатын тәсіл – кодтарды U+DC80 – U+DCFF диапазонға аудару, бұл төменгі (соңғы) жалған мәндер болып табылады және осылайша «жарамсыз» UTF-16 болып саналады, Python-ның PEP 383 (немесе «жалған қашу») әдісінде қолданылады. MirBSD OPTU 8/16 деп аталатын тағы бір кодтау оларды жеке пайдалану аймағында U+EF80 – U+EFFF түріне түрлендіреді. Екі тәсілде де байт мәні шығыс кодтық нүктесінің кішігірім сегіз битіне кодталады. Бұл кодтаулар өте пайдалы, себебі олар «жарамсыз» байт тізбектерімен кейінірек, тіпті қажет болмаса, айналысу қажеттілігін жояды және «мәтін» мен «деректер» байт массивтерінің бірдей нысан болуына мүмкіндік береді. Егер бағдарлама ішкі түрде UTF-16 қолданғысы келсе, жарамсыз UTF-8 файл атауларын сақтау және пайдалану қажет; Windows файлдық жүйе API UTF-16 қолданғандықтан, жарамсыз UTF-8 қолдауын қажет етуі азаяды. Кодтаудың қайтымды болуы үшін, қате байттар үшін қолданылатын кодтық нүктелердің стандартты UTF-8 кодтамалары жарамсыз деп есептелуі керек. Бұл кодтауды WTF-8 немесе CESU-8 форматымен (тек 128 кодтық нүкте үшін) үйлесімсіз етеді. Қайта кодтау кезінде жарамды UTF-8-ге кері түрленетін қате кодтық нүктелер тізбегіне назар аудару қажет, себебі оларды зиянды бағдарламалар күтпеген символдарды шығару үшін пайдалануы мүмкін, бірақ бұл ASCII символдарына әкелмейді, сондықтан салыстырмалы түрде қауіпсіз деп саналады, өйткені зиянды тізбектер (мысалы, сайттар аралық скрипттер) көбінесе ASCII символдарына сүйенеді.