簡體   English   中英

U +究竟是什么代表什么,為什么我不能在我的C ++應用程序中創建一個Unicode中間字符串表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM