究竟U +代表什么,在我的C ++应用程序,为什么我不能创建的Unicode字符串中间的桌子吗?

StackOverflow https://stackoverflow.com/questions/4261985

我试图从Java +摆幅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使用\Ú因为我得到的形式的警告的堆:

  

字符表示由通用字符名称“\ u3042”不能在当前代码页(1250)来表示

不要骂我笨,我试图用文件 - >高级保存选项都无济于事,该代码页似乎没有变化的。好像这是一个已知的问题:如何创建在Visual C ++ 2008一个UTF-8字符串文字

我使用的表是相当短的,所以用的Vim的帮助和一些入门级的正则表达式魔法,我可以将其转换为 \ X30 \ X42 符号。不幸的是,将QString不会从这样一个输入正确初始化。我什么都试过。 fromAscii(),fromUtf8(),fromLocal8Bit(),QString的(QByteArray中)的作品。然后,试图写U + 3042无BOM到一个文件,然后以十六进制模式查看它,我发现它实际上原来是的“E3 81 82” 即可。突然,像这样的条目似乎与工作的的QString :: fromAscii()即可。现在我在想有多少不正是在“U +”代表在“U + 3042”(因为0xE38182 - 0x3042 = E35140,也许我最好这个魔术常量添加到所有我想成为的Unicode字符?)。我应该如何从这里继续得到适当的UTF-8字符串数组?

有帮助吗?

解决方案

的问题是,C ++是基于C,这可以追溯到ASCII年龄。 “默认” C字符串“ABC”是8位。您的Visual C ++编译器有16个比特的Unicode(UTF-16)文字,虽然具有稍微不同的语法:L"abc\u3042"。的类型,这类文字的是wchar_t[N]代替char[N],可以将它们存储在std::wstring

Qt的完全理解wchar_t和将QString可以从中直接构造无需转换的问题。

其他提示

你看到的是字符的UTF-8编码。

>>> u'\u3042'.encode('utf-8').encode('hex')
'e38182'

如果你写他们全力以赴UTF-8,那么你应该罚款。

在“U +”只是表明你正在寻找一个Unicode码点,而不是一些特定的编码。

修改

一个小的scriptlet来帮助你开始,在Python(语言相同以上):

>>> print ',\n'.join(', '.join('"%s"' % (y.encode('utf-8').encode('string-escape')
      ,) for y in x) for x in [u'あいうえお', u'かきくけこ', u'さしすせそ'])
"\xe3\x81\x82", "\xe3\x81\x84", "\xe3\x81\x86", "\xe3\x81\x88", "\xe3\x81\x8a",
"\xe3\x81\x8b", "\xe3\x81\x8d", "\xe3\x81\x8f", "\xe3\x81\x91", "\xe3\x81\x93",
"\xe3\x81\x95", "\xe3\x81\x97", "\xe3\x81\x99", "\xe3\x81\x9b", "\xe3\x81\x9d"

“U + DDDD ”,其中每个 d 是十六进制数字表示Unicode代码点。

可以不存储在8位字符的16位值;这就是你遇到的主要问题。

使用宽字符,例如(这些是字符串文字)L"\0x3042"L"\u3042"

然后找出如何使QString的接受那些。

注意:Visual C ++会发出sillywarning为文字内使用的\U符号,而G ++将发射sillywarnings该符号用于文字以外

干杯&第h。,

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top