【问题标题】:How convert wchar_t to unicode number?如何将 wchar_t 转换为 unicode 数字?
【发布时间】:2015-04-18 06:55:59
【问题描述】:

如何将 wchar 值转换为 unicode 表中的数字?

我有一个变量:

wchar_t znak;
znak=getwchar();

我输入 'ą' 如何将 znak 转换为 #261 我需要 unicode 表中的数字。

± U+0105 带有 OGONEK 的拉丁文小写字母 A

UTF-16: 0x0105

XML: & # 261;

【问题讨论】:

  • 0x105 (base-16) 261 (base-10)。

标签: c unicode


【解决方案1】:

标准没有指定sizeof(wchar_t)(或其编码),所以您应该说明您使用的是什么系统。

假设 *nix(Linux、BSD、OSX 等)

wchar_t 为 32 位,存储 UTF-32 码位,这是一种定长编码。您可以直接使用znak 而无需转换。

虽然您应该首先检查 UTF-8 和 char 是否更适合您的任务(对于转换,UTF-32 肯定更好,但您的程序可能做得更多)。

如果您确定 UTF-8 对您的程序来说是一个整体更好的选择,您可以使用 mbstowcs 从您的 UTF-8 代码点中获取一个 UTF-32 代码点。

假设 Windows

wchar_t 是 16 位,存储 UTF-16LE 代码单元。但是对于控制台 I/O,您仅限于 UCS-2。不同之处在于 UTF-16 不是固定长度的编码。所谓的代理对(尽管很少见)允许表示非BMP 代码点。

所以在你的情况下,直接使用 znak 也可以。

为了完整起见,这里有一个可能的实现from the UTF-16 Wikipedia article

u32 read_code_point_from_utf16()
{
  u16 code_unit = getu16();
  if (code_unit >= 0xD800 && code_unit <= 0xDBFF) {
    u16 code_unit_2 = getu16();
    if (code_unit_2 >= 0xDC00 && code_unit_2 <= 0xDFFF)
       return (code_unit << 10) + code_unit_2 - 0x35FDC00;
    push_back(code_unit_2);
  }
return code_unit;
}

最后,使用sprintf(s, "&amp;#%d;", znak)sprintf(s, "0x%x", znak) 将其放入所需的基础。

【讨论】:

  • 次要:"0x%04x 而不是 "0x%x
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 2012-09-09
  • 2013-05-07
  • 2018-01-07
  • 2011-03-14
  • 2021-01-29
  • 2010-09-09
相关资源
最近更新 更多