Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从字符的ascii码点到wstring_C++_Wstring_Codepoint - Fatal编程技术网

C++ 从字符的ascii码点到wstring

C++ 从字符的ascii码点到wstring,c++,wstring,codepoint,C++,Wstring,Codepoint,使用下面的代码,我可以使用代码点字符的wstring。 如果代码点>65535,则采用错误的wstring。你必须怎么做 wstring giveWStringFromASCII(size_t i) { wchar_t character[]= {i,0}; return wstring(character); } wstring使用wchar\t元素。wchar_t不可移植,因为它在Windows上使用2字节UTF-16编码,但在其他平台上使用4字节UTF-32编码 仅在非W

使用下面的代码,我可以使用代码点字符的wstring。 如果代码点>65535,则采用错误的wstring。你必须怎么做

wstring giveWStringFromASCII(size_t i)
{
    wchar_t character[]= {i,0};
    return wstring(character);
}
wstring使用wchar\t元素。wchar_t不可移植,因为它在Windows上使用2字节UTF-16编码,但在其他平台上使用4字节UTF-32编码

仅在非Windows平台上,可以将存储在大小中的Unicode码点按原样分配给wchar。在Windows上,单个wchar\U t只能处理BMP UCS-2范围U+0000-U+FFFF中的Unicode字符。较高的代码点必须编码为2个wchar__t元素,在UTF-16中称为代理项对

您所展示的内容只能在非Windows平台上正常工作。如果需要支持多个平台,则必须相应地定义代码,例如:

std::wstring giveWStringFromCodepoint(size_t cp)
{
    #ifdef _WIN32

    wchar_t ch[2];
    if (cp < 0x10000)
    {
        ch[0] = (wchar_t) cp;
        return std::wstring(ch, 1);
    }
    else
    {
        cp -= 0x10000;
        ch[0] = (wchar_t) ((cp >> 10) + 0xD800);
        ch[1] = (wchar_t) ((cp & 0x3FF) + 0xDC00);
        return std::wstring(ch, 2);
    }

    #else

    wchar_t ch = (wchar_t) i;
    return std::wstring(&ch, 1);

    #endif
}
或:

或:

也就是说,最好使用第三方Unicode库(如ICONV或ICU)为您处理这种类型的转换


如果您使用的是C++11或更高版本,它有std::u16string和std::u32string可用于避免std::wstring的可移植性问题。在可能的时候考虑使用它们。或者,至少在使用UTF转换时考虑使用STD::WSTRUGIN转换,如果不使用第三方库。

对你有用吗?不,必须是从代码点> 65535,0xffffascII和> 65535的WStand。不可能的你说的是Unicode?@manni66-ASCII的最大值是127;有一系列扩展ASCII编码,使用128到255的值。请用更完整的句子说。我不知道你在问什么。我不会检查实际上是ifdef _WIN32的窗口,而是检查wchar_t的大小-它更简单、更清晰、更正确。你可以检查wchar_MAX的值。如果wchar_MAX==65535。。。elif WCHAR_MAX==4294967295。。。else错误不支持wchar\t size endif。谢谢大家。这取决于操作系统。
std::wstring giveWStringFromCodepoint(size_t cp)
{
    #if (WCHAR_MAX > 0xFFFF)

    wchar_t ch = (wchar_t) i;
    return std::wstring(&ch, 1);

    #else

    wchar_t ch[2];
    if (cp < 0x10000)
    {
        ch[0] = (wchar_t) cp;
        return std::wstring(ch, 1);
    }
    else
    {
        cp -= 0x10000;
        ch[0] = (wchar_t) ((cp >> 10) + 0xD800);
        ch[1] = (wchar_t) ((cp & 0x3FF) + 0xDC00);
        return std::wstring(ch, 2);
    }

    #endif
}
std::wstring giveWStringFromCodepoint(size_t cp)
{
    if (sizeof(wchar_t) > 2)
    {
        wchar_t ch = (wchar_t) i;
        return std::wstring(&ch, 1);
    }
    else
    {
        wchar_t ch[2];
        if (cp < 0x10000)
        {
            ch[0] = (wchar_t) cp;
            return std::wstring(ch, 1);
        }
        else
        {
            cp -= 0x10000;
            ch[0] = (wchar_t) ((cp >> 10) + 0xD800);
            ch[1] = (wchar_t) ((cp & 0x3FF) + 0xDC00);
            return std::wstring(ch, 2);
        }
    }
}