[英]What exactly does U+ stand for and why can't I create a table of Unicode intermediate strings in my C++ application?
我正在嘗試將應用程序從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)
並且不要叫我傻,我試圖使用文件 - >高級保存選項無濟於事,代碼頁似乎根本沒有改變。 似乎這是一個已知問題: 如何在Visual C ++ 2008中創建UTF-8字符串文字
我正在使用的表格相當短,所以在Vim和一些入門級regexp-magic的幫助下,我能夠將它轉換為\\ x30 \\ x42表示法。 不幸的是,QStrings不會從這樣的輸入中正確初始化。 我嘗試了一切。 fromAscii(),fromUtf8(),fromLocal8Bit(),QString(QByteArray),作品。 然后,嘗試將沒有BOM的U + 3042寫入文件,然后以十六進制模式查看,我發現它實際上是“E3 81 82” 。 突然,像這樣的條目似乎適用於QString :: fromAscii() 。 現在我想知道“U +”在“U + 3042”中的含義是多少(因為0xE38182 - 0x3042 = E35140,也許我最好將這個Magic Constant添加到我想要的所有Unicode字符中?)。 我應該如何從這里開始獲得一系列正確的UTF-8字符串?
您所看到的是該角色的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"
問題是C ++基於C,它可以追溯到ASCII時代。 “默認”C字符串“abc”是8位。 但是,Visual C ++編譯器具有16位Unicode(UTF-16)文字,但語法略有不同: L"abc\あ"
。 這種文字的類型是wchar_t[N]
而不是char[N]
,你可以將它們存儲在std::wstring
。
Qt完全理解wchar_t
和QStrings可以直接從它們構造而不會出現轉換問題。
“U + dddd ”,其中每個d是十六進制數字表示Unicode代碼點。
您不能在8位字符中存儲16位值; 這是你遇到的主要問題。
使用寬字符,例如(這些是字符串文字) L"\\0x3042"
或L"\あ"
。
然后弄清楚如何使QString接受那些。
注意:Visual C ++將為文字中使用的\\U
符號發出愚蠢的警告,而g ++將為文字外部使用的符號發出愚蠢的警告。
干杯&hth。,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.