【问题标题】:Playing cards Unicode printing in C++C++ 中的扑克牌 Unicode 打印
【发布时间】:2018-06-12 09:35:18
【问题描述】:

根据this wiki link,扑克牌有 U+1f0a1 形式的 Unicode。 我想在 C++ 中创建一个数组来处理 52 张标准扑克牌,但我注意到这个 Unicode 比 2 个字节长。

所以我下面的简单示例不起作用,如何存储长度超过 2 个字节的 Unicode 字符?

wchar_t t = '\u1f0a1';
printf("%lc",t);

以上代码将t截断为\u1f0a

【问题讨论】:

  • 打印宽字符串使用wprintf
  • 这是问题的一部分......因为 wchar 只存储 2 个字节,我正在处理更长的 unicode 字符
  • 对于超过 2 个字节的字符,您可以使用 char32_t,但看起来很难在控制台中打印这些字符 (see here)
  • @SiddharthChabra 使用std::wstring 而不是wchar_t。在 wchar_t 为 2 个字节的平台上 (Windows),使用 UTF-16 对 std::wstring 进行编码,例如:std::wstring t = L"\uD83C\uDCA1";

标签: c++ unicode printf


【解决方案1】:

如何存储更长的 2 字节 unicode 字符?

您可以使用带有前缀Uchar32_t,但无法将其打印到控制台。此外,您根本不需要char32_t,utf-16 足以编码该字符。 wchar_t t = L'\u2660',您需要前缀 L 来指定它是一个宽字符。


如果你使用的是带有Visual C++编译器的Windows,我推荐一种方式:

  1. 使用 utf-8 编码保存您的源文件
  2. 设置编译参数/utf-8,引用here
  3. 使用支持 utf-8 编码的控制台,如 Git Bash 来查看结果。

【讨论】:

  • 大部分都是错误的。有办法在控制台输出UTF-16,git bash什么都没有,主要是♠!=?.
  • @n.m.好的,现在我将其更改为“推荐方式”。 :D
  • “使用 git bash”不是推荐的方式,因为它需要安装第三方软件。
【解决方案2】:

在 Windows wchar_t 存储一个 UTF-16 代码单元,您必须将您的字符串存储为 UTF-16(使用带有prefix 的字符串文字)这对您也没有帮助,因为 Windows 控制台只能输出最多 0xFFFF 的字符。看到这个:

How to use unicode characters in Windows command line?

【讨论】:

  • 各种控制台替换可以处理全范围的 Unicode 字符(我使用的是 ConEmu,它可以毫无问题地显示有问题的字符)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多