2010-04-21 176 views
3

我有一個寬字符串是L「hao123--我的上網主頁」,它必須編碼爲「hao123 - \ u7114 \ u4A0A \ u7F51 \ u4E3B \ u9875」 。我被告知,編碼字符串是一種特殊的「%uNNNN」格式,用於編碼Unicode UTF-16碼點。在this website中,它告訴我它是JavaScript轉義。但我不知道如何用C++編碼。C++ unicode UTF-16編碼

它有任何圖書館得到這個工作?或給我一些提示。

謝謝我的朋友們!

回答

2

在字符串文字中嵌入unicode通常不是一個好主意,也不是可移植的;不能保證wchar_t將是16位,並且編碼將是UTF-16。雖然在使用Microsoft Visual C++(特定C++實現)的Windows上可能會出現這種情況,但wchar_t在OS X的GCC(另一種實現)上爲32位。如果你有某種本地化的字符串常量,最好在某種特定的編碼中使用配置文件,並將它們解釋爲在該編碼中編碼。 International Components for Unicode (ICU)庫爲解釋和處理unicode提供了很好的支持。另一個用於轉換(但不解釋)編碼格式的好庫是libiconv

編輯
有可能我誤解你的問題......如果問題是,你必須在UTF-16的字符串已經,並希望將其轉換爲「Unicode的逃生ASCII」(即其中Unicode字符由「\ U」後面跟着一個字符的數值表示的ASCII字符串),然後用下面的僞代碼:

 
for each codepoint represented by the UTF-16 encoded string: 
    if the codepoint is in the range [0,0x7F]: 
     emit the codepoint casted to a char 
    else: 
     emit "\u" followed by the hexadecimal digits representing codepoint 

現在,拿到碼點,有一個很簡單的規則... UTF-16字符串中的每個元素都是一個代碼點,除非它是「代理對」的一部分,在這種情況下,它和它之後的元素構成一個代碼點。如果是這樣,那麼unicode標準定義了將「主導代理」和「尾隨代理」組合爲單個代碼點的過程。請注意,UTF-8和UTF-16都是可變長度編碼...如果代碼點沒有用可變長度表示,則需要32位。 Unicode Transformation Format (UTF) FAQ解釋了編碼以及如何識別代理對以及如何將它們組合成代碼點。

+0

但這是要求,我沒有選擇,應用程序將只能在Windows中運行。任何人都可以給我一個例子來轉換它。 順便說一下,ICU網站不能在這裏訪問。 謝謝 – Dan 2010-04-21 03:44:35

+0

@丹,如果您在Windows上使用L「hao123 - \ x6211 \ x7684 \ x4E0A \ x7F51 \ x4E3B \ x9875」,那麼它應該是一個常量wchar_t *字符串,並且它應該以UTF-16編碼...但是,你必須弄清楚,不管它是UTF-16LE還是UTF-16BE(即它是小端還是大端)。我懷疑這將是小端,但你必須嘗試。我不使用Windows(我是一個* NIX的人,並且我不太喜歡微軟,因爲它故意不遵守IEEE標準1003.1以及有意不符合ISO C99和其他標準),所以你將不得不在你的系統上嘗試它...... – 2010-04-21 03:52:11

+0

@丹,...如果你將常量wchar_t *轉換爲const char *,然後將每個字節單獨打印爲十六進制數,那麼你得到?如果你分享,那麼回答你的問題應該會更容易。 – 2010-04-21 03:53:09

0

只需使用\x而不是\u

+0

我只是將它存儲在一個字符串中,如果x,我當然可以將它改爲u。但是,我如何轉換它?謝謝 – Dan 2010-04-21 03:46:30