c ++添加" \ u"串起来

时间:2017-12-20 23:30:30

标签: c++ string unicode utf

学习c ++,尝试通过在" \ u"之后添加4位数来找到显示UTF-16字符的方法。但是,例如,如果我尝试直接添加0000:

string temp = "\u" + "0000";

我收到错误:错误形成的通用字符名称。那么有没有办法让这两个形成一个Unicode字符?另外我意识到最后四个数字的范围是0-F但是现在我只想关注0-9个字符。

如何添加" \ u"用不同的字符串

编辑:我一直在寻找与JavaScript函数相当的C ++:

String.fromCharCode()

3 个答案:

答案 0 :(得分:2)

你不能说"\u" + "0000",因为转义序列的解析发生在实际编译开始之前的过程的早期。当字符串被拼接在一起时,转义序列已经被解析并且不再被赢得。由于\u本身不是一个有效的转义序列,因此会出现错误。

答案 1 :(得分:1)

你想要做的是不可能的。 C ++解析分为多个阶段。在[lex.phases]中,转义序列(在阶段5中)在相邻字符串文字连接之前被转义(阶段6)。

答案 2 :(得分:0)

您无法像这样分隔字符串文字。引号内的特殊序列是编译器在编译时插入相关Unicode字符的指令,因此如果将其分成两部分,则不再将其识别为指令。

以编程方式根据其Unicode代码点编号生成UTF-16字符,您可以使用标准库Unicode转换函数。遗憾的是,UTF-32(Unicode代码点)和UTF-16之间没有直接转换,因此您必须通过UTF-8作为中间值:

// UTF-16 may contain either one or two char16_t characters so
// we return a string to potentially contain both.
///
std::u16string codepoint_to_utf16(char32_t cp)
{
    // convert UTF-32 (standard unicode codepoint) to UTF-8 intermediate value
    char utf8[4];
    char* end_of_utf8;

    {
        char32_t const* from = &cp;

        std::mbstate_t mbs;
        std::codecvt_utf8<char32_t> ccv;

        if(ccv.out(mbs, from, from + 1, from, utf8, utf8 + 4, end_of_utf8))
            throw std::runtime_error("bad conversion");
    }

    // Now convert the UTF-8 intermediate value to UTF-16

    char16_t utf16[2];
    char16_t* end_of_utf16;

    {
        char const* from = nullptr;

        std::mbstate_t mbs;
        std::codecvt_utf8_utf16<char16_t> ccv;

        if(ccv.in(mbs, utf8, end_of_utf8, from, utf16, utf16 + 2, end_of_utf16))
            throw std::runtime_error("bad conversion");
    }

    return {utf16, end_of_utf16};
}

int main()
{
    std::u16string s; // can hold UTF-16

    // iterate through some Greek codepoint values
    for(char32_t u = 0x03b1; u < 0x03c9; ++u)
    {
        // append the converted UTF-16 characters to our string
        s += codepoint_to_utf16(u);
    }

    //  do whatever you want with s here...    
}