ПредишенСледващото

Редица езици използват знаци, които са по-големи от снимачната площадка на стойности от тип Чар.

Японски и китайски - може би най-близките примери.

Библиотеката GNU C включва поддръжка за два механизма за работа с разширен набор от символи: многобайтови символи и широки знаци. Тази глава описва как да се използват тези механизми и функции за конвертиране между двете.

Ако системата ви поддържа разширени знаци, той ги поддържа и как многобайтови символи и как продължителен знаци. Библиотеката включва функции, които можете да използвате, за да конвертирате между двете представителства. Тези функции са описани в тази глава.

Компютърната система може да поддържа повече от един многобайтови символни код, и повече от един широк характер код. Потребителят управлява избора на кодове през текущия локал за класификация характер (вж. Глава 19 [стандарти]). Всеки стандарт определя конкретна мулти-байт код характер и специфичен продължителен характер код. Избирането на стандарта се отразява на поведението на функциите на превръщане в библиотеката.

Някои стандарти не подкрепят разширените символи, нито nontrivial мулти-битови символи. Тези стандарти, библиотечни функции за преобразуване продължават да работят, дори ако те са най-вече тривиални.

Ако решите nnovy стандарт за класификация на характер, вътрешни възможности за смяна, поддържани от тези функции могат да станат объркани, така че - не се променят стандарта, докато сте в средата на обработката на линия.

При нормална ASCII код, последователност от символи последователност от байтове, и всеки един от героите - един байт. Това е много проста, но позволява само 256 различни герои.

многобайтови символни кодът, байт последователност поредица от знаци, но всеки символ може да вземе една или повече последователни последователност от байтове.

Има много различни начини, за да създават по-байт код характер; Различни системи използват различни кодове. Специфичните кодиращи метод определя основа символ байтови последователности, които представляват един символ и какво символи те заместват. Кодът, че компютърът може да се ползват в действителност трябва да има краен брой на тези основни последователности, и обикновено никой от тях не по-дълго от няколко знака.

Тези последователности не са с еднаква дължина. В действителност, много от тях - само един байт. Тъй като основните ASCII символи в диапазона 0-0177 са толкова важни, че те стоят сами за себе си във всички кодове многобайтови знаци. Т.е. байт, чиято стойност е между 0 и 0177 - винаги има характер само по себе си. Герои, които са по-големи от един байт винаги трябва да започват с един байт в диапазона 0200-0377.

Стойност 0 байт може да се използва за завършване на линия, точно както често се използва в низ ASCII характер.

Определяне на основни последователности от байтове представляват единични символи автоматично са дадени стойностите на по-дълги последователности от байтове на повече от един символ. Например, ако последователността на два байта 0205 049 замества символ на гръцката алфа, на 0205 049 065 трябва да замени алфа, последвано от "" (ASCII код 065) и 0205 049 049 0205 трябва да замени двете алфа в един ред.

Ако някой байт последователност може да има повече от една стойност, тъй като поредица от символи, многобайтов код е двусмислен и опасно. Кодове, че системата е в действителност се използват всички е ясно.

В повечето кодове, има някои последователности от байтове, които нямат стойност като знак или знаци. Те се наричат ​​неприемливо.

Евентуалното простият многобайтов код - тривиално:

Основните последователности се състоят от един байт.

Този специфичен код не се използва мулти-битови символи като цяло. Той няма никакви вредни последователности. Но това може да се справи само 256 знака.

Тук е още една възможност код, който може да се справи 9376 различни герои:

Основните последователности се състоят от
  • единични байтове със стойности в диапазона от 0 до 0237.
  • два байта последователности, в които двете байтове имат стойности в интервала 0240-0377.

Този код или други подобни се използва на някои системи, за да представляват японските йероглифи. Незаконни последователности - тези, които се състои от нечетен брой последователни байта в интервала 0240-0377.

Ето още един мулти-байт код, който може да се справи по-различни разширените символи, всъщност, почти тридесет милиона:

Основните последователности се състоят от
  • единични байтове със стойности в диапазона от 0 до 0177.
  • последователности до четири байта, чиито първи байт е в интервала 0200-0237, и останалите байта са в интервала 0240-0377.
В този код, който и да е последователност, която започва с байта в диапазона 0240-0377, е недопустимо.

Тук е още една опция, която има предимство: чрез премахване на последния байт или байта приемливи герои никога не могат да се появят друг валиден характер.

Основните последователности се състоят от
  • единични байтове със стойности в диапазона от 0 до 0177.
  • два байта последователности, в които първият байт е в интервала 0200-0207, а втората байта са в интервала 0240-0377.
  • три байта последователности, в които първият байт е в интервала 0210-0217, докато други байта са в интервала 0240-0377.
  • четири байта последователности, в които първият байт е в интервала 0220-0227, докато други Bajtal са в интервала 0240-0377.

Броят на възможно мулти-байт код е много голям. Въпреки това, тази компютърна система ще поддържа повече от няколко различни кодове. (Един от тези кодове могат да отчете хиляди различни знаци.) Друг компютърна система може да поддържа напълно различен код. съоръжения библиотека, описани в тази глава, са полезни, защото те описват детайлите на мулти-байт код конкретна компютърна система, въпреки че вашата програма не трябва да знае.

Можете да използвате специални стандартни макроси, за да намерите най-големият брой на героите байта в текущата многобайтов кода MB_CUR_MAX Използване на разстояние, а максималният размер за многобайтов код, даден на вашия компютър се съдържа в MB_LEN_MAX. Това - максималната дължина на многобайтов характер за всички, за да се гарантира, стандарти. Той е определен в "limits.h". Този макрос дисплеи (вероятно не са константа) израз на положително число, което е максималният брой байтове в многобайтов характер в настоящия стандарт. Стойността никога не е по-голям от MB_LEN_MAX.

MB_CUR_MAX, определени в "stdlib.h".

Какво се случва, ако се опитате да премине низ, който съдържа функция мулти-битови символи, които не знаете за тях? Обикновено, тази функция обработва низа като последователност от байтове, и интерпретира някои конкретни стойности; всички други ценности байтове са "нормални". Ако многобайтов символ не съдържа специална байт стойност, функцията трябва да се лекува, като че ли са някои общи знаци.

Разширени герои са много по-прости от мулти-битови символи. Те - само на символи с повече от осем бита, така че има място за повече от 256 различни кодове. Wchar_t тип широк характер на данните, който има достатъчно голям диапазон за провеждане разширени символни кодове като ASCII кодове.

Ако системата ви поддържа разширени символи, като всеки символ е напреднала и разширен символ код и съответната многобайтов основната последователност.

В тази глава терминът код се използва за обозначаване на един широк характер обект, за да се подчертае разликата от Чар на тип данни.

mbstowcs функция конвертира низа многобайтов в масив от широки знаци. wcstombs функция прави обратния процес. Тези функции са декларирани в заглавния файл "stdlib.h".

В повечето програми, тези функции - само вашите нужди за конвертиране между удължените линии и струните многобайтови знаци. Но те имат ограничения. Ако данните не е нулев прекратено, или - не всички наведнъж в ядрото, може да се наложи да се използва функция за превключване на ниско ниво, за да я превърне в един знак в даден момент. Виж. Раздел 18.7 [Конвертиране един знак]. mbstowcs ( "многобайтов до поредица от широки знаци") функция превръща нулевата прекратено низ до края на знаци многобайтовите в масив от широки знаци, поддържане на не повече от размера на разширените символи в масива има wstring. Крайният нулев характер се изчислява легло, така че, ако размерът му е по-малко от действителния брой на широки знаци от следния ред, без прекратяване нулев знак не се запазва.

Превръщането на герои от низ започва с първоначална регистъра на параметъра.

Ако не се намери невалиден многобайтови символни последователност, функцията връща стойност от -1. В противен случай, той се връща броя на широки знаци, съхранявани в wstring на масив. Това число не включва прекратяване нула символа, което е налице, ако броят им е по-малък от размера.

Ето един пример, който показва как да конвертирате низ от многобайтови символи, като си запазва достатъчно място за резултата. wcstombs превръща множество разширени символи с нулев знак в края на низ от мулти-битови символи, поддържане на не повече от байтове размер, като се започне с низ.

Ако сте намерили кода, който не съответства на са празни характер, тази функция връща стойност от -1. В противен случай, връщане стойност - броя байтове, съхранявани в масива. Това число не включва прекратяване нулев характер, която е достъпна само ако броят - по-малко от размера.

Върната стойност mblen разграничава три възможности: първите размер байта на ред старт с характер са празни, те започват с невалидни байт последователност или само част от символа или низ показва празен ред (празен характер).

За са празни характер, mblen връща броя на байтовете в този характер (винаги най-малко 1, и никога повече, отколкото размер). За невалиден байт последователност, mblen връща -1. За празен низ, той се връща 0.

Ако многобайтови символни код използва знаци, смяна регистър, а след това mblen, поддържа и променя регистъра на параметъра. Ако се обадите mblen нулев указател към низ, го включи параметър, за да се регистрирате стандартната първоначалната стойност. Виж. Раздел 18.9 [параметър Регистрирайте се].

функция Mblen е обявен в "stdlib.h".

Можете да конвертирате множество битови символи в разширените символи в един mbtowc функция. Wctomb функция прави точно обратното. Тези функции са обявени в "stdlib.h". Mbtowc превръща първата многобайтов символ в низа в съответната широк характер код. Тя съхранява резултата в * резултат. Mbtowc никога не разглежда повече от байтове размер. (. Идеята е да се даде възможност за размера на броя на байтове данни, които имате) Mbtowc който не е празен низ връщане mblen стойност разграничава три възможности: първите размер байта на низа започват с са празни характер, те започват с невалиден байт последователност или просто част характер, или низ точки празен низ (нулев характер).

За са празни характер, превръща го в mbtowc напреднали характер, го съхранява в * резултат, и връща броя на байтовете в този характер (винаги най-малко 1, и никога не bololshe от размера).

За невалиден байт последователност, mbtowc 1. връща празен низ, връща 0, това да се съхрани 0 * резултат. wctomb функция преобразува широк характер WCHAR код в съответното многобайтови символни последователност и съхранява резултата в байтове, като се започне с низ. Wctomb който не е празен низ разграничава три възможности за WCHAR: валиден широк характер код (един, който може да бъде преведен на многобайтови символни), невалиден код и 0.

Ако WCHAR - невалиден широк характер код, wctomb връща -1. Ако WCHAR - 0, връща 0, също съхраняване 0 в * низ.

Извикването на тази функция с нулева WCHAR аргумент, когато редът - не нула, е страничен ефект от reinitializing параметъра съхранява като регистъра спасяване многобайтови символни 0 и се връща 0.

Ето един пример, който чете mnogobaytovoy знака текст от входно ЕВРОВОК и пише съответните широки символи, за да ЕВРОВОК изход. Ние трябва да конвертирате героите един по един в този пример, защото mbstowcs не може да продължи след нулевата характер и не може да се справи с очевидно неприемливо частичен характер четене голямо количество вход.

В някои многобайтови кодове характер, стойността на всяка конкретна последователност от байтове не е фиксиран; тя зависи от други секвенции, обсъдени по-рано в същия ред. Обикновено има само няколко последователности, които могат да променят стойността на други последователности; тези няколко последователности се наричат ​​регистри, и ние казваме, че те създават регистър настройка за други последователности, които следват.

За да се илюстрира състоянието на регистър, и регистрира последователността, предполагам, че се установи, че последователността на 0200 (само един байт) влиза японски режим, в който двойките байтове в диапазона от 0240 до 0377 са единични символи, докато 0201 въвежда Latin-1 режим в която единични байтове в диапазона от 0240 до 0377 са символи и се интерпретират в съответствие с набор от Latin-1 характер на Международната организация по стандартизация. Това - многобайтов код, който има два заместник регистър статут ( "Япония режим" и "Latin-1 режим"), две регистри и последователности, които определят специфичния регистър статус.

Ето един пример mblen спазването на тези правила: mblen функции и mbtowc wctomb не се използва, когато се използва мулти-байт код, който използва малки и големи букви. Въпреки това, няма други библиотечни функции, не поставят тези функции, така че няма нужда да се тревожи за това.

Подкрепете проекта - споделете линка, благодаря!