【问题标题】:c++: how to create unsigned char from UTF-8 code pointc++:如何从 UTF-8 代码点创建无符号字符
【发布时间】:2012-01-24 17:00:48
【问题描述】:

我正在使用 C++ 库,需要从 UTF-8 代码点创建一个无符号字符。例如,如果代码点是decimal 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 类型,因为我正在与第 3 方库交互。

【问题讨论】:

  • Debug的类型是什么? Debug 能识别 UTF 吗?因为 C++ ostreams 没有。您需要一个库来处理 UTF,尤其是 UTF8。
  • unsigned char 只能保证保存最大 255 的值; Unicode 代码点可以更大。您的问题没有很好地说明。
  • 啊,如果可以做到这一点,生活会轻松很多.....
  • 没有 UTF-8 码位这样的东西,你是指 UTF-8 码位还是 Unicode 码位?
  • Debug::WriteLine 看起来像 .NET...似乎是 C++/CLI!?

标签: c++ utf-8 char unsigned


【解决方案1】:

unsigned char 太小,无法容纳 610 的值(假设 char 为 8 位宽,它只能容纳 0 到 255 之间的值),所以它将 wrap around*

使用 char16_t 存储 16 位字符(或使用 char32_t 存储 UTF-8 要求的 32 位字符)。

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 在此处用作 代码点
  • @MooingDuck,您忘了提到char16_t 不足以容纳每个代码点,因此应避免使用。根据 Windows 的要求,char16_t 字符串可用于保存 UTF-16。
【解决方案2】:

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

uint32_t codePoint = someString.CodePointAt(x);

您可以在此处阅读更多信息:http://en.wikipedia.org/wiki/Code_point

【讨论】:

  • Unicode 最多使用 21 位。没有可以表示 17-31 位数据的数值数据类型,因此您需要一个 32 位数值类型来表示 21 位数据。
【解决方案3】:

如果您的意思是要创建一个指向 Unicode 代码点 610 的 UTF-8 表示的无符号字符,您可以这样做:

char unsigned temp[] = { 0xc9, 0xa2 };

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 2013-04-12
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多