如何将wchar_t转换为unicode号?

时间:2015-04-18 06:55:59

标签: c unicode

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

我有一个变量:

wchar_t znak;
znak=getwchar();

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

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

UTF-16:0x0105

XML:& #261;

1 个答案:

答案 0 :(得分:5)

标准没有指定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, "&#%d;", znak)sprintf(s, "0x%x", znak)将其纳入所需的基础。