我有一个需要wchar_t
数组作为参数的函数。我不知道标准库函数可以将char转换为wchar_t
,所以我写了一个快速的脏函数,但我希望有一个可靠的解决方案,没有bug和未定义的行为。标准库是否有一个函数可以进行这种转换?
我的代码:
wchar_t *ctow(const char *buf, wchar_t *output)
{
const char ANSI_arr[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()-_=+[]{}\\|;:'\",<.>/? \t\n\r\f";
const wchar_t WIDE_arr[] = L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()-_=+[]{}\\|;:'\",<.>/? \t\n\r\f";
size_t n = 0, len = strlen(ANSI_arr);
while (*buf) {
for (size_t x = 0; x < len; x++) {
if (*buf == ANSI_arr[x]) {
output[n++] = WIDE_arr[x];
break;
}
}
buf++;
}
output[n] = L'\0';
return output;
}
3条答案
按热度按时间5sxhfpxr1#
转换函数是在
stdlib.h
(*)中声明的。但是你必须知道,对于latin 1(即ISO-8859-1字符集)中的任何字符,转换为宽字符仅仅是一个赋值,因为Unicode代码中256以下的字符是latin 1字符。因此,如果您的初始字符集是ISO-8859-1,则转换简单:
如果调用者传递了一个指向一个数组的指针,该数组的大小足以存储所有 * 转换的 * 字符。
如果你使用任何其他字符集,你将不得不使用一个众所周知的库,如icu,或手工构建一个,这对单字节字符集(ISO-8859-x系列)来说很简单,对多字节字符集(如UTF8)来说更麻烦。
但是不知道你想要能够处理的字符集,我不能说更多...
顺便说一句,纯ASCII是ISO-8859-1字符集的子集。
(*)从cplusplus.com
将多字节序列转换为宽字符pmb指向的多字节字符被转换为wchar_t类型的值并存储在pwc指向的位置。该函数返回多字节字符的长度(以字节为单位)。
mbtowc
有自己的内部移位状态,只有在调用此函数时才能根据需要进行更改。使用空指针作为pmb调用此函数会重置状态(并返回多字节字符是否与状态相关)。此函数的行为取决于所选C语言环境的LC_CTYPE类别。
g6baxovj2#
它在头文件wchar. h中有,它被称为btowc:
如果c的值为EOF或(unsigned char)c在初始移位状态下不构成有效的单字节字符,则btowc函数返回WEOF。否则,它返回该字符的宽字符表示。
uqxowvwt3#
这不是从
wchar_t
到char
的转换。它是一个用于销毁ISO-646之外的数据的函数。C库中没有方法可以为您进行这种转换。您可以查看ICU 4C库。如果您只使用Windows,您可以查看Win32 API中的相关函数(WideCharToMultiByte等)。