输出任意数字作为unicode

时间:2014-07-17 09:05:05

标签: c++ unicode cout

如何在输出到终端时将任意数字解释为Unicode?

例如:

#include <iostream>

int main() {
    int euro_dec = 0x20AC;

    std::cout << "from int: " << euro_dec
              << "\nfrom \\u: \u20AC" << std::endl;

    return 0;
}

打印:

from int: 8364
from \u: €

转义序列\u如何将数字0x20AC解释为Unicode?

我使用wcout测试,输出为:

from int: 8364
from \u: 

2 个答案:

答案 0 :(得分:3)

程序文本中出现的unicode转义序列在转换的第一阶段(2.2p1b1 [lex.phases] )转换为等效的Unicode字符。甚至在程序被标记化或预处理之前就会发生这种情况。

要将表示为整数的Unicode代码点转换为本机窄多字节编码,请使用c32rtomb

#include <cuchar>

char buf[MB_CUR_MAX];
std::mbstate_t ps{};
std::size_t ret = std::c32rtomb(buf, euro_dec, &ps);
if (ret != static_cast<std::size_t>(-1)) {
    std::cout << std::string(buf, &buf[ret]);   // outputs €
}

请注意cuchar支持不足;如果您知道您的原生窄字符串编码是UTF-8,则可以使用codecvt_utf8<char32_t>,否则您将不得不使用特定于平台的工具。

答案 1 :(得分:0)

当你输出整数变量时,库会将值转换为文本,它实际上不会将值作为整数输出。

使用"\u"时,编译器读取数字并将其转换为适当的字节序列,直接插入文字字符串。