3

我在处理数组中的 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。

4

1 回答 1

4

由于'\u0B95'需要 3 个字节,因此它被视为多字符文字。多字符文字具有类型int和实现定义的值。(实际上,我认为 gcc 这样做是不正确的

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。

于 2012-11-24T23:41:36.020 回答