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
数组中时,这样的代码点将占用三个char
s。多字符字符常量是完全不同的东西。
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_t
和char32_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++ 发送的 cv::MAT 字节数组转换为 Java 中的位图?
国际化时django.po中的msgstr =“”为中文时,django-admin.py compilemessages 出错:无效的多字节序列