繁体   English   中英

从字符的ascii代码点到wstring

[英]from ascii codepoint of character to wstring

使用下面的代码,我可以获取代码点字符的wstring。 如果codepoint> 65535,请输入错误的wstring。 必须怎么做?

wstring giveWStringFromASCII(size_t i)
{
    wchar_t character[]= {i,0};
    return wstring(character);
}

std::wstring使用wchar_t元素。 wchar_t不可移植,因为在Windows上使用2字节(UTF-16编码),而在其他平台上使用4字节(UTF-32编码)。

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

您显示的内容只能在非Windows平台上按原样工作。 如果需要支持多个平台,则必须相应地#ifdef代码,例如:

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
}

要么:

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);
        }
    }
}

话虽这么说,您最好使用第三方代码库(如ICONV或ICU)来为您处理这种类型的转换。

如果您使用的是C ++ 11或更高版本,则它具有std::u16stringstd::u32string可用,以避免std::wstring的可移植性问题。 考虑尽可能使用它们。 或者,至少在处理UTF转换时考虑使用std::wstring_convert (如果未使用第三方库)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM