使用标准库将char转换为wchar_t?

icomxhvb  于 2023-03-28  发布在  其他
关注(0)|答案(3)|浏览(139)

我有一个需要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;
}
5sxhfpxr

5sxhfpxr1#

转换函数是在stdlib.h(*)中声明的。但是你必须知道,对于latin 1(即ISO-8859-1字符集)中的任何字符,转换为宽字符仅仅是一个赋值,因为Unicode代码中256以下的字符是latin 1字符。
因此,如果您的初始字符集是ISO-8859-1,则转换简单:

wchar_t *ctow(const char *buf, wchar_t *output) {
 wchar_t cr = output;
    while (*buf) {
        *output++ = *buf++;
    }
    *output = 0;
    return cr;
}

如果调用者传递了一个指向一个数组的指针,该数组的大小足以存储所有 * 转换的 * 字符。
如果你使用任何其他字符集,你将不得不使用一个众所周知的库,如icu,或手工构建一个,这对单字节字符集(ISO-8859-x系列)来说很简单,对多字节字符集(如UTF8)来说更麻烦。
但是不知道你想要能够处理的字符集,我不能说更多...
顺便说一句,纯ASCII是ISO-8859-1字符集的子集。
(*)从cplusplus.com

int mbtowc (wchar_t* pwc, const char* pmb, size_t max);

将多字节序列转换为宽字符pmb指向的多字节字符被转换为wchar_t类型的值并存储在pwc指向的位置。该函数返回多字节字符的长度(以字节为单位)。
mbtowc有自己的内部移位状态,只有在调用此函数时才能根据需要进行更改。使用空指针作为pmb调用此函数会重置状态(并返回多字节字符是否与状态相关)。
此函数的行为取决于所选C语言环境的LC_CTYPE类别。

g6baxovj

g6baxovj2#

它在头文件wchar. h中有,它被称为btowc:
如果c的值为EOF或(unsigned char)c在初始移位状态下不构成有效的单字节字符,则btowc函数返回WEOF。否则,它返回该字符的宽字符表示。

uqxowvwt

uqxowvwt3#

这不是从wchar_tchar的转换。它是一个用于销毁ISO-646之外的数据的函数。C库中没有方法可以为您进行这种转换。您可以查看ICU 4C库。如果您只使用Windows,您可以查看Win32 API中的相关函数(WideCharToMultiByte等)。

相关问题