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

时间:2016-07-03 22:09:42

标签: c arrays type-conversion ansi widestring

我有一个函数需要wchar_t数组作为参数。我不知道有一个标准库函数可以从char转换为wchar_t所以我写了一个快速的脏功能,但我想要一个没有错误和未定义行为的可靠解决方案。标准库是否具有进行此转换的功能?

我的代码:

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 个答案:

答案 0 :(得分:1)

嗯,转换函数在stdlib.h(*)中声明。但是你必须知道,对于latin1中的任何字符,即ISO-8859-1字符集,转换为宽字符只是一个分配,因为低于256的unicode代码的字符是latin1字符。

因此,如果您的初始字符集是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这样的多字节的游戏来说更加轻松。

但是如果不知道你想要处理的字符集,我就不能说更多......

BTW,plain ascii是ISO-8859-1 charset的子集。

(*)来自cplusplus.com

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

将多字节序列转换为宽字符   pmb指向的多字节字符将转换为wchar_t类型的值,并存储在pwc指向的位置。该函数返回多字节字符的字节长度。

     

mbtowc有自己的内部移位状态,只有通过调用此函数才会根据需要进行更改。使用空指针调用函数作为pmb会重置状态(并返回多字节字符是否依赖于状态)。

     

此函数的行为取决于所选C语言环境的LC_CTYPE类别。

答案 1 :(得分:0)

这不是从wchar_tchar的转换。它是用于销毁ISO-646之外的数据的功能。 C库中的任何方法都不会为您进行转换。您可以查看ICU4C库。如果您只在Windows上,可以查看Win32 API中的相关函数(WideCharToMultiByte等)。

答案 2 :(得分:0)

它在标头wchar.h中。它被称为btowc:

  

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