使用没有 Unicode 等效项的函数

未使用 Unicode 版本实现的函数通常已被支持 Unicode 的更强大或扩展的函数所取代。 例如,如果要移植调用 OpenFile 函数的代码,则应用程序可以通过改用 CreateFile 函数来支持 Unicode。

如果函数没有 Unicode 等效项,则应用程序可以在函数调用之前和之后将字符映射到 8 位字符集和从 8 位字符集映射字符。 例如,数字格式设置函数 atoiitoa 仅使用数字 0 到 9。 通常,将 Unicode 映射到 8 位字符会导致数据丢失,但可以通过使代码类型无关并使表达式成为条件来避免这种情况。 以下示例中为 8 位字符编写的语句依赖于类型,应更改以支持 Unicode。

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 将 Unicode 转换为 ASCII。 该示例依赖于这样一个事实,即 0 到 9 的数字始终可以从 Unicode 转换为 ASCII,即使某些周围的文本不能。 atoi 函数在非数字的任何字符处停止。

应用程序可以使用国家语言支持 (NLS) LCMapString 函数来处理文本,其中包括为 Unicode 中的某些脚本提供的 本机数字

注意

错误地使用 wcstombs 函数可能会危及应用程序的安全性。 确保 8 位字符串的应用程序缓冲区至少为 2* (char_length +1) ,其中 char_length 表示 Unicode 字符串的长度。 之所以存在此限制,是因为将 双字节字符集 (DBCSs) ,每个 Unicode 字符可以映射到两个连续的 8 位字符。 如果缓冲区不保存整个字符串,则结果字符串不会以 null 结尾,这会带来安全风险。 有关应用程序安全性的详细信息,请参阅 安全注意事项:国际功能

 

使用 Unicode 和字符集