【问题标题】:Dynamically calculating unicode characters动态计算 unicode 字符
【发布时间】:2019-07-12 14:12:06
【问题描述】:

对于游戏,我需要处理扑克牌。我想利用Playing cards in Unicode,它基本上归结为U+1F0XY,其中X 设置颜色,Y 设置卡片表面。

我现在需要实现一个函数,该函数返回一个字符串,其中包含一个表示卡片的 Unicode 字符。我需要使用什么数据类型而不是占位符 unicode_char_t 来对 Unicode 字符进行数学运算?

std::string cardToUnicodeChar(uint8_t face, uint8_t color)  {
  unicode_char_t unicodeCharacter = 0x1F000 + (color << 4) + face;
  return std::string(unicodeCharacter);
}

【问题讨论】:

  • std::string 是一个 byte 字符串。 UTF-8 是 byte 编码的 Unicode。请改用 UTF-8 编码字符。
  • @Someprogrammerdude 您能否为我的问题中的代码提供一个示例(可能使用不同的类型而不是 std::string)来为我指明正确的方向?
  • ICU 是一个提供全面 Unicode 支持的库。您的特定平台可能已经提供了出色的 Unicode 支持。
  • @Eljay 您能否提供一个我的小函数 abvoe 的示例实现,使用 ICU 作为答案让我开始?

标签: c++ unicode


【解决方案1】:

如果这是一个孤立的地方,您打算使用计算的 unicode 字符,您可以基于以下内容。

1F0XY 在 UTF-8 中的按位编码为:

11110000 10111111 100000XX 10XXYYYY

你可以这样构造:

uint8_t buf[5];
buf[0] = 0xf0;
buf[1] = 0x9f;
buf[2] = 0x80 | (color & 12) >> 2;
buf[3] = 0x80 | (color & 3) << 4 | face & 15;
buf[4] = 0;
return std::string(buf);

【讨论】:

  • 从技术上讲,std::string 没有接受 uint8_t[] 作为输入的构造函数。除非您的编译器将uint8_t 定义为char 的别名,否则您需要使用类型转换。而且您根本不需要空终止符,您可以将显式大小传递给构造函数:return std::string(reinterpret_cast&lt;char*&gt;(buf), 4); 请注意,C++20 将添加 char8_tstd::u8string 以处理 UTF-8 字符串。
猜你喜欢
  • 1970-01-01
  • 2011-07-19
  • 2017-05-03
  • 1970-01-01
  • 2014-10-07
  • 2011-11-09
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多