【问题标题】:Output arbitrary number as unicode将任意数字输出为 unicode
【发布时间】:2014-07-17 09:05:05
【问题描述】:

如何使任意数字在输出到终端时被解释为 Unicode?​​p>

例如:

#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?​​p>

我使用wcout 进行了测试,输出为:

from int: 8364
from \u: 

【问题讨论】:

  • wchar_t euro_dec = 0x20ac;
  • 您在代码中所做的任何事情都不会影响结果是否被解释为 Unicode。

标签: c++ unicode cout


【解决方案1】:

程序文本中出现的 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&lt;char32_t&gt;,否则您将不得不使用特定于平台的工具。

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 我想知道为什么*(char*)(&amp;euro_dec) 不工作。或者也许我会。
  • 但是根据我的理解,Unicode 欧元的二进制表示 与 20AC 相同吗?但它与各种编码不同。
  • @BartekBanachewicz 因为取消引用会给你一个char
  • @Lerp 哦等等,在一个例子中是\u20ac,而我尝试做的是将20ac 视为unicode 字节序列。
猜你喜欢
  • 1970-01-01
  • 2017-06-17
  • 2017-11-24
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多