Одно- и двухбайтовые наборы символов
В двухбайтовом наборе символ представляется либо одним, либо двумя байтами. Так, для японской каны, если значение первого байта находится между 0x81 и 0x9F или между 0xE0 и 0xFC, надо проверить значение следующего байта в строке, чтобы определить полный символ. Работа с двухбайтовыми наборами символов — просто кошмар для программиста, так как часть их состоит из одного байта, а часть — из двух.
Простой вызов функции strlen не дает количества символов в строке — она возвращает только число байтов. В ANSI-библиотске С нет функций, работающих с двухбайтовыми наборами символов. Но в аналогичную библиотеку Visual C++ включено множество функций (типа _mbslen), способных оперировать со строками мультибайтовых (как одно-, так и двухбайтовых) символов.
Для работы с DBCS-строками в Windows предусмотрен целый набор вспомогательных функций:
Функция |
Описание | ||
PTSTR CharNext (PCTSTR pszCurrentChar); |
Возвращает адрес следующего символа в строке | ||
PTSTR CharPrep(PCTSTR pszStart, PCTSTR pszCurrentChar); |
Возвращает адрес предыдущего символа в строке | ||
BOOL IsDBCSLeadByte (BYTE bTestChar); |
Возвращает TRUE, если данный байт — первый в DBCS-символе |
Функции CharNext и CharPrev появоляют "перемещаться" по двухбайтовой строке единовременно на 1 символ вперед или назад, a IsDBCSLeadByte возвращает TRUE, если переданный ей байт — первый в двухбайтовом символе
Хотя эти функции несколько облегчают работу с DBCS-строками, необходимость в ином подходе очевидна. Перейдем к Unicode.