2011-06-02 28 views
1

我解析的XML文件可以包含不同語言的本地化字符串(目前只有英文和西班牙文,但將來可能是任何語言),API XML解析器通過UTF8編碼的char *返回XML中的所有數據。在寬數據上使用窄字符串操作函數

對數據進行解析後(在其中搜索子串,連接字符串,確定子串長度等)需要對數據進行一些處理。

使用strlen,strcat等標準函數會很方便。由於我從XML解析器接收到的原始數據是char *,我可以使用這些標準字符串處理函數輕鬆完成所有操作。

但是,這些當然都假設和要求的字符串是NULL終止。 因此,我的問題是 - 如果您將寬數據表示爲char *,那麼可以在數據內部而不是在數據末尾出現NULL終止符?

即,如果某個特定語言的字符不需要2個字節來表示它,並且它在一個字節中表示,那麼其他字節是否可以爲NULL?

回答

3

UTF-8不是「寬」的。 UTF-8是多字節編碼,其中Unicode字符可能需要1到4個字節。 UTF-8在有效字符內不會有零終止符。確保你不會對你的解析器給你的東西感到困惑。它可以是UTF-16或UCS2或其等寬字符串中的4個字節,在這種情況下,您必須將它們視爲寬字符串。

+0

因此,如果解析器返回UTF8我可以在UTF-8數據上作爲char *操作,然後在顯示字符串之前調用UTF8toUTF16轉換函數? (gui元素使用uint16 *(無符號短符號)參數)。 – Gruntcakes 2011-06-02 18:31:34

+0

是的,但是當用UTF-8編碼時,您不會知道字符串中有多少個字符。 – cababunga 2011-06-02 18:42:34

+0

UTF-8是1到4個字節,由於Unicode代碼點的範圍不需要,所以5和6字節編碼已被刪除。 – 2011-06-02 18:55:48

0

Ç多字節字符和寬字符之間區分:

  • 寬字符必須能夠表示執行字符的任何字符使用集完全相同的字節數(例如如果兀需要4個字節來表示,則A還必須佔用4個字節來表示)。寬字符編碼的例子有UCS-4和已棄用的UCS-2。

  • 多字節字符可能需要不同數量的字節來表示。多字節編碼的例子是UTF-8和UTF-16。

當使用UTF-8,您可以繼續使用str*功能,但你必須記住,他們不提供一種方式來返回字符的字符串的長度,你需要轉換爲寬字符,並使用wcslenstrlen返回字節的長度,而不是字符,這在不同情況下很有用。

我不能強調執行字符集的所有元素都需要以字節表示爲預定義大小的單個寬字符。有些系統的寬字符使用UTF-16,結果是實現不能符合C標準,並且有些功能不可能正常工作。

+0

從XML解析器輸出的內容將類似於「text1 {.text2} {text3}」。我需要形成像「text1 somethingelse text3」這樣的字符串。所以需要解析'{','}'和'。'並隨着時間的推移建立一個新的字符串。如果我處理的內容不是'{','}','。'作爲與字符相反的字節流,我假設我可以使用strcpy,strcat等函數來生成結果,然後將結果轉換爲utf16。 – Gruntcakes 2011-06-02 20:58:56

+0

是的,正如我所說的,'str *'函數大部分工作在UTF-8中,使用相同的語義,除了'strlen()',由於'char' ='byte','multibyte char'≠'字節/ char'。 – ninjalj 2011-06-02 21:02:45