Поделиться через


Использование функций, не имеющих эквивалентов Юникода

Функции, которые не были реализованы в версии Юникода , обычно заменяются более мощными или расширенными функциями, поддерживающими Юникод. Например, если вы переносите код, вызывающий функцию OpenFile , приложение может поддерживать Юникод с помощью функции CreateFile .

Если функция не имеет эквивалента в Юникоде, приложение может сопоставлять символы с 8-разрядными наборами символов до и после вызова функции. Например, функции форматирования чисел atoi и itoa используют только цифры от 0 до 9. Как правило, сопоставление Юникода с 8-разрядными символами приводит к потере данных, но этого можно избежать, сделав код независимым от типа и сделав выражения условными. Операторы в следующем примере, написанные для 8-разрядных символов, зависят от типа и должны быть изменены для поддержки Юникода.

char str[4] = "137";

int num = atoi(str);

Эти инструкции можно переписать следующим образом, чтобы сделать их независимыми от типа.

TCHAR tstr[4] = TEXT("137");

#ifdef UNICODE
size_t cCharsConverted;
CHAR strTmp[SIZE]; // SIZE equals (2*(sizeof(tstr)+1)). This ensures enough
                   // room for the multibyte characters if they are two 
                   // bytes long and a terminating null character. See Security 
                   // Alert below. 

wcstombs_s(&cCharsConverted, strTmp, sizeof(strTmp), (const wchar_t *)tstr, sizeof(strTmp));
num = atoi(strTmp);

#else

int num = atoi(tstr);

#endif 

В этом примере стандартная функция библиотеки C wcstombs преобразует Юникод в ASCII. Пример основан на том факте, что цифры от 0 до 9 всегда можно перевести из Юникода в ASCII, даже если некоторые из окружающих текста не могут быть преобразованы. Функция atoi останавливается на любом символе, который не является цифрой.

Приложение может использовать функцию LCMapString (NLS) для обработки текста, содержащего собственные цифры , предоставленные для некоторых скриптов в Юникоде.

Внимание!

Неправильное использование функции wcstombs может поставить под угрозу безопасность приложения. Убедитесь, что буфер приложения для строки из 8-разрядных символов имеет по крайней мере размер 2*(char_length +1), где char_length представляет длину строки Юникода. Это ограничение обусловлено тем, что при использовании двухбайтовых наборов символов (DBCS) каждый символ Юникода можно сопоставить с двумя последовательными 8-разрядными символами. Если буфер не содержит всю строку, результирующая строка не завершается null, что создает угрозу безопасности. Дополнительные сведения о безопасности приложений см. в разделе Вопросы безопасности: международные функции.

 

Использование Юникода и наборов символов