我正在尝试将应用程序从 Java + Swing 转换为 C++ + Qt。在某一时刻,我不得不处理一些 Unicode 中间体。在 Java 中,这相当容易:
private static String[] hiraganaTable = {
"\u3042", "\u3044", "\u3046", "\u3048", "\u304a",
"\u304b", "\u304d", "\u304f", "\u3051", "\u3053",
...
}
...而在 C++ 中我遇到了问题:
QString hiraganaTable[] = {
"\x30\x42", "\x30\x44", "\x30\x46", "\x30\x48", "\x30\x4a",
"\x30\x4b", "\x30\x4d", "\x30\x4f", "\x30\x51", "\x30\x53",
...
};
我不能在 VS2008 中使用 \u 因为我收到了一堆形式的警告:
由通用字符名称“\u3042”表示的字符无法在当前代码页中表示 (1250)
而且不要说我愚蠢,我尝试使用 File->Advanced Save Options 无济于事,代码页似乎根本没有改变。似乎这是一个已知问题:How to create a UTF-8 string literal in Visual C++ 2008
我使用的表格很短,所以在 Vim 和一些入门级的正则表达式魔术的帮助下,我能够将它转换为\x30\x42表示法。不幸的是,QStrings 不会从这样的输入正确初始化。我什么都试过了。fromAscii(), fromUtf8(), fromLocal8Bit(), QString(QByteArray), 作品。然后,尝试将没有 BOM 的 U+3042 写入文件,然后以十六进制模式查看,我发现它实际上是"E3 81 82"。突然,像这样的条目似乎可以与QString::fromAscii()一起使用. 现在我想知道“U+3042”中的“U+”到底代表多少(因为 0xE38182 - 0x3042 = E35140,也许我最好将这个魔术常数添加到我所有可能的 Unicode 字符中?)。我应该如何从这里开始获取正确的 UTF-8 字符串数组?