如何在unicode表中将wchar值转换为数字?
我有一个变量:
wchar_t znak;
znak=getwchar();
我输入'±'如何将znak转换为#261 我需要unicode表中的数字。
±U + 0105带有OGONEK的拉丁文小写字母
UTF-16:0x0105
XML:& #261;
答案 0 :(得分:5)
标准没有指定sizeof(wchar_t)
(或其编码),因此您应该说明您所使用的系统。
wchar_t
是32位并存储UTF-32代码点,这是一个固定长度的编码。您可以直接使用znak
,无需转换。
虽然您应首先检查UTF-8和char
是否不能更好地完成您的任务(对于转换,UTF-32当然更好,但您的程序可能会做得更多)。
如果您确定UTF-8是您的程序的总体更好的选择,您可以使用mbstowcs
从UTF-8代码点获取UTF-32代码点。
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)
将其纳入所需的基础。