【问题标题】:c++ adding "\u" to stringc ++将“\ u”添加到字符串
【发布时间】:2018-06-03 14:10:44
【问题描述】:

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

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

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

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

编辑:我正在寻找 JavaScript 函数的 C++ 等价物:

String.fromCharCode()

【问题讨论】:

  • 你为什么要把它们分成两个字符串?你对编程了解多少?编译器将引号之间的特殊序列转换为 Unicode 字符(显然在编译时)。你真正想要完成什么?
  • "试图找到一种显示 UTF-16 字符的方法" - 然后使用 UTF-16 字符串类型,例如 Windows 上的 std::wstringstd::u16string C++11 及更高版本。并使用可以显示 Unicode 字符串的 API。您正在做的甚至不是在 C++ 中处理 Unicode 字符串的正确方法
  • 我试图创建一个函数,通过传入 XXXX 来返回带有代码 \uXXXX 的字符。我只需要一种方法来用 XXXX 解析 \u 来做到这一点
  • 你想添加什么编码? UTF8?
  • \unnnn(其中n = 0-9A-F)是将unicode代码点添加到字符串的约定。这些代码点采用的格式取决于它们的编码。你想要什么编码UTF-8? UTF-16? UTF-32?

标签: c++ string unicode utf


【解决方案1】:

你不能像那样分隔 字符串文字。引号内的特殊序列是编译器在编译时插入相关 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...    
}

【讨论】:

    【解决方案2】:

    您尝试做的事情是不可能的。 C++ 解析分为多个阶段。根据 [lex.phases],转义序列(在第 5 阶段)在 相邻字符串文字连接之前(第 6 阶段)进行转义。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 2019-09-19
        • 1970-01-01
        • 2017-09-16
        • 2015-12-10
        相关资源
        最近更新 更多