C++ 数组中的多字节 UTF-8

Posted

技术标签:

【中文标题】C++ 数组中的多字节 UTF-8【英文标题】:Multi-Byte UTF-8 in Arrays in C++ 【发布时间】:2012-11-12 20:31:27 【问题描述】:

我在处理数组中的 3 字节 Unicode UTF-8 字符时遇到了问题。当它们在 char 数组中时,我会收到多字符字符常量和隐式常量转换警告,但是当我使用 wchar_t 数组时,wcout 什么也不返回。由于项目的性质,它必须是数组而不是字符串。下面是我一直在尝试做的一个例子。

#include <iostream>
#include <string>
using namespace std;
int main()

    wchar_t testing[40];
    testing[0] = L'\u0B95';
    testing[1] = L'\u0BA3';
    testing[2] = L'\u0B82';
    testing[3] = L'\0';
    wcout << testing[0] << endl;
    return 0;

有什么建议吗?我正在使用 OSX。

【问题讨论】:

当您将它们存储在char 数组中时,这样的代码点将占用三个chars。多字符字符常量是完全不同的东西。 wstring 不是 utf8(它们不一定是 UTF-16 或 UCS4)。你不知道它们是什么编码,所以在它们里面写固定值是自找麻烦。 它们没有任何编码。它们只是一些字节。 【参考方案1】:

由于'\u0B95' 需要3 个字节,它被认为是一个多字符文字。多字符文字具有类型 int 和实现定义的值。 (其实是I don't think gcc is correct to do this)

L 前缀放在文字之前使其具有wchar_t 类型并具有实现定义的值(它映射到执行宽字符集中的值,这是一个实现定义基本执行宽字符集的超集)。

C++11 标准为我们提供了一些更多的 Unicode 感知类型和文字。其他类型是char16_tchar32_t,它们的值是代表字符的Unicode 代码点。它们分别类似于 UTF-16 和 UTF-32。

由于您需要字符文字来存储来自基本多语言平面的字符,因此您需要 char16_t 文字。例如,这可以写为u'\u0B95'。因此,您可以按如下方式编写代码,而不会出现警告或错误:

char16_t testing[40];
testing[0] = u'\u0B95';
testing[1] = u'\u0BA3';
testing[2] = u'\u0B82';
testing[3] = u'\0';

很遗憾,I/O 库不能很好地处理这些新类型。

如果您确实不需要使用上述字符文字,您可以使用新的 UTF-8 字符串文字:

const char* testing = u8"\u0B95\u0BA3\u0B82";

这会将字符编码为 UTF-8。

【讨论】:

以上是关于C++ 数组中的多字节 UTF-8的主要内容,如果未能解决你的问题,请参考以下文章

VS2010与VS2013中的多字节编码与Unicode编码问题

从 C++ 中的字节数组创建 HICON?

从 C++ 中的字节数组中提取非零索引的最快方法是啥

C++:.bmp 到文件中的字节数组

如何将从 C++ 发送的 cv::MAT 字节数组转换为 Java 中的位图?

国际化时django.po中的msgstr =“”为中文时,django-admin.py compilemessages 出错:无效的多字节序列