Кіріспе

Мәліметтер түрі
Екі есе кең (CJK идеограф өлшемі) ASCII таңбаларының нұсқалары.

Кең таңба – дәстүрлі 8 биттік таңбадан әдетте үлкен өлшемді компьютерлік таңбаның дерек типі. Дерек типінің ұлғайтылған мөлшері үлкен кодталған таңбалар жиынтығын қолдануға мүмкіндік береді.

Тарих

1960 жылдары мейнфрейм және мини-компьютер өндірушілері ең кіші дерек түрі ретінде 8 биттік байтты стандарттауды бастады. 7 биттік ASCII таңбалар жиынтығы телетайп машиналары мен компьютерлік терминалдар үшін әріптік-сандық таңбаларды кодтаудың өнеркәсіптік стандартты әдісіне айналды. Қосымша бит деректерді сақтау және берудің дұрыстығын қамтамасыз ету үшін теңдікке пайдаланылды. Нәтижесінде, 8 биттік байт ASCII таңбаларын жадыда сақтайтын компьютерлік жүйелер үшін де-факто дерек түріне айналды. Кейін компьютер өндірушілері ASCII таңбалар жиынтығын ағылшын алфавиті таңбаларының шектеулі жиынтығынан тысқары кеңейту үшін бос битті пайдалана бастады. IBM кодтық беті 37, PETSCII және ISO 8859 сияқты 8 биттік кеңейтулер кеңінен таралды, грек, кириллица және тағы да көптеген терминалдарды қолдауды ұсынды. Алайда, мұндай кеңейтулер әлі де шектеулі болды, себебі олар аймақтық еді және көбінесе бірге қолданыла алмады. Бір таңбалар жиынтығынан екіншісіне түрлендіру үшін арнайы түрлендіру процедуралары қолданылуы керек болды, бұл мақсатты жиынтықта эквивалентті таңба болмаған жағдайда көбінесе мәліметтердің жоғалуына әкелетін аудармаға соқтыратын еді. 1989 жылы Халықаралық Стандарттау Ұйымы (ISO) 16 биттік (2 байт) немесе 32 биттік (4 байт) мәнді пайдалана отырып кодталатын көптілді таңбалар жиынтығын (UCS) жасау жөніндегі жұмыстарды бастады. Бұл үлкен мәндер жаңа таңбалық мәндерді жадыда сақтау үшін 8 биттен үлкен дерек түрін пайдалануды талап етті. Осылайша, оларды дәстүрлі 8 биттік таңбалық дерек түрлерінен ажырату үшін "кең таңба" термині қолданылды.

UCS және Юникодпен байланыс

Кең таңба – жадтағы дерек типінің мөлшерін көрсетеді. Бұл, әрбір мәннің таңбалар жиынтығында қалай анықталатынын білдірмейді. Мұндай мәндер керісінше, таңбалар жиынтықтары арқылы анықталады, ал UCS және Unicode – 8 биттік сандық мәннен (барлығы 255) көбірек таңбаларды кодтайтын екі кең таралған жиынтық болып табылады.

Көп байттық таңбаларға қатынасы

Бұрынғы деректерді тарату жүйелері 8 биттік таза деректер жолының болмауынан зардап шеккендей, қазіргі заманғы тарату жүйелерінде де жиі 16 биттік немесе 32 биттік деректер жолына қолдау көрсетілмейді. Осының салдарынан UTF-8 сияқты таңбалық кодтау жүйелері пайда болды, олар бір 8 биттік символға қарағанда үлкен мәнді кодтау үшін бірнеше байтты пайдалана алады. C стандарты, әрбір таңбаны бейнелеу үшін байттардың белгілі бір немесе өзгермелі санын қолданатын таңбалардың көпбайттық кодтамаларын (көбінесе бастапқы кодта және сыртқы файлдарда қолданылады) және кең таңбаларды – яғни, орындалу кезінде бір нысандағы таңбалардың ұсынылуын (әдетте 8 биттен асады) ажыратады.

Кең таңбаның өлшемі

UCS 2 ("Unicode 1.0") ерте қабылдануы бірқатар платформаларда, әсіресе Microsoft Windows, .NET және Java-да UTF-16 кеңінен қолданылуына әкелді. Бұл жүйелерде 16 биттік "кең таңба" (C/C++; Java) типі жиі кездеседі. Бұл типтер әрқашан бір "символға" тікелей сәйкес келмейді, себебі Unicode-тың толық диапазонын сақтау үшін прокси жұптары қажет (1996, Unicode 2.0). Unix сияқты жүйелер әдетте 21 биттік Unicode код нүктесіне сәйкес 32 битті пайдаланады, C90 стандартында көрсетілгендей. "Кең таңба" типінің мөлшері жүйенің қандай мәтіндік кодировкаларды өңдей алатынын анықтамайды, өйткені түрлендірулер қолжетімді. (Дегенмен, ескі түрлендіру кодтары көбінесе проксилерді ескермейді.) Олардың қабылдануының тарихи жағдайлары қолданылатын кодировка түрлерін де анықтайды. Unicode 1.0 әсеріне түскен жүйе, мысалы Windows, негізінен кең таңба бірліктерінен құралған "кең жолдарды" қолданады. Ал Unix сияқты басқа жүйелер 8 биттік "тар жол" конвенциясын сақтап, "кең" символдарды өңдеу үшін көпбайтты кодировканы (көбінесе UTF-8) пайдалануға бейім.

C/C++

C және C++ стандартты кітапханалары кең таңбалармен және олардан құралған жолдармен жұмыс істеу үшін бірқатар құралдарды қамтиды. Кең таңбалар `wchar_t` дерек типі арқылы анықталады, ол бастапқы C90 стандартында «қолдау көрсетілетін локальдер арасындағы ең үлкен кеңейтілген таңбалар жиынтығының барлық мүшелері үшін ерекше кодтарды ұсынатын бүтін сан типі» (ISO 9899:1990 §4.1.5) деп анықталған. C және C++ екеуі де 2011 жылғы өз стандарттарының жаңартуларында 16 биттік және 32 биттік Юникод түрлендіру форматтарын нақты бейнелеу үшін белгілі өлшемді таңбалар типтерін – `char16_t` және `char32_t` енгізді, ал `wchar_t` іске асылуын анықталмаған қалдырды. ISO/IEC 10646:2003 Unicode 4.0 стандартында мынадай делінген: «`wchar_t` ені компиляторға тәуелді және 8 биттен кіші болуы мүмкін. Сондықтан, кез келген C немесе C++ компиляторында тасымалданатын бағдарламалар Юникод мәтінін сақтау үшін `wchar_t` пайдаланбауы керек. `wchar_t` типі компилятормен анықталған кең таңбаларды сақтауға арналған, олар кейбір компиляторларда Юникод таңбалары болуы мүмкін».

Python-тың атауы

Python 2.7 құжаттамасына сәйкес, тіл кейде wchar_t-ны өзінің Py_UNICODE таңба түрінің негізі ретінде пайдаланады. Бұл сол жүйеде wchar_t-ның «таңдалған Python Unicode құрастыру түрімен үйлесімді» болуына байланысты. Бұл ерекшелік Python 3.3 нұсқасынан бастап икемді UCS-1/2/4 сақтау енгізілгеннен кейін ескірді, ал Python 3.12 нұсқасынан бастап wchar_t, яғни Py_UNICODE typedef, Python тізбектері үшін (іске асырудағы wstr) қолданудан тоқтатылды және бұрынғысынша «UTF-8 ұсынылымы қажет болғанда жасалады және Unicode нысанында сақталады».