C++如何从UTF-8的码点创建无符号字符?

5

我正在使用一个C++库,并需要从UTF-8代码点创建一个无符号字符。例如,如果代码点是十进制610(一个“拉丁字母小型大写G”),我该如何在C++中创建它?

在javascript中,我可以执行以下操作:

var temp = String.fromCharCode(610);
console.log(temp); // Outputs a small 'G' (correct)
var codePoint = temp.charCodeAt(0);
console.log(codePoint); // Outputs 610 (correct)

在C++中尝试过:

unsigned char temp = (unsigned char)610;
// compiles, but
Debug::WriteLine((int)temp); // outputs 98 (??)

请提供一个C++代码示例,以执行与上面的javascript示例相同的操作。
环境是托管C++,但我想避免使用CLR类型,因为我正在与第三方库进行接口交互。

Debug 的类型是什么?Debug 是否识别 UTF?因为 C++ 的输出流不支持 UTF,所以你需要一个库来处理 UTF,特别是 UTF8。 - Mooing Duck
unsigned char 只能保证存储值到 255;而 Unicode 码点可以更大。你的问题没有被清楚地陈述。 - Kerrek SB
啊,如果能做到这一点,生活会变得轻松许多...... - David Heffernan
2
不存在所谓的UTF-8代码点,您是指UTF-8代码单元还是Unicode代码点? - dalle
Debug::WriteLine 看起来像是 .NET ... 似乎是 C++/CLI!? - mmmmmmmm
3个回答

5

unsigned char是一个8位的字符类型,无符号的范围是从0到255,因此它不能存储610这个值,会绕回*

使用char16_t来存储16位字符(或者使用char32_t来存储32位字符,UTF-8需要)。

char32_t temp = (char32_t)610;
Debug::WriteLine(temp); // outputs 610 (!!)

如果您想处理UTF-8字符串,请使用UTF-8字符串字面量:
u8"I'm a UTF-8 string."

*即使在您的示例中,它也会重复两次:

610 - 256 - 256 = 98


请注意,这里使用的char16_tchar32_t是作为代码点使用的。 - Mooing Duck
@MooingDuck,您忘了提到char16_t无法足够大地容纳每个码点,并且应该因此避免使用。可以使用char16_t字符串来按照Windows的要求容纳UTF-16。 - Mark Ransom

3

Unicode代码点可能需要32位表示。在大多数西方语言中,16位就足够了,但为了处理所有可能的Unicode代码点,确实需要32位。

uint32_t codePoint = someString.CodePointAt(x);

你可以在这里阅读更多关于它的信息:http://en.wikipedia.org/wiki/Code_point

Unicode使用高达21位。没有数值数据类型可以表示17-31位的数据,因此您需要一个32位的数值类型才能表示21位的数据。 - Remy Lebeau

0
如果您想创建一个指向Unicode代码点610的UTF-8表示的无符号字符,可以执行以下操作:
char unsigned temp[] = { 0xc9, 0xa2 };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接