2012-03-18 48 views
10

流行的軟件開發人員和公司(Joel Spolsky, Fog Creek software)傾向於編寫C或C++代碼時使用wchar_t的爲Unicode字符存儲。關於良好的編碼習慣,何時以及如何使用charwchar_t正確使用字符串存儲在C和C++

我特別感興趣的是在編寫利用Unicode的軟件時符合POSIX

當使用wchar_t的,您可以查找字符的寬字符數組中的每個字符或每個數組元素的基礎上:

/* C code fragment */ 
const wchar_t *overlord = L"ov€rlord"; 
if (overlord[2] == L'€') 
    wprintf(L"Character comparison on a per-character basis.\n"); 

你如何比較的Unicode字節(或字符)使用時char

到目前爲止,我的首選用C比較型字符的字符串和字符的方式往往是這樣的:

/* C code fragment */ 
const char *mail[] = { "ov€[email protected]", "ov€[email protected]" }; 
if (mail[0][2] == mail[1][2] && mail[0][3] == mail[1][3] && mail[0][3] == mail[1][3]) 
    printf("%s\n%zu", *mail, strlen(*mail)); 

爲字節相當於Unicode字符的這種方法掃描。 Unicode歐元符號佔用3個字節。因此需要比較三個字符數組字節,以確定Unicode字符是否匹配。通常您需要知道要比較的字符或字符串的大小以及它爲解決方案工作產生的位數。這看起來根本不是處理Unicode的好方法。 有沒有比較char類型的字符串和字符元素的更好方法?

另外,當使用wchar_t時,如何將文件內容掃描到數組?函數fread似乎沒有產生有效的結果。

+9

C++中的Unicode:不要使用'wchar_t',使用正確的Unicode庫。 – 2012-03-18 10:35:00

+3

'傾向於使用wchar_t進行Unicode字符編碼。沒有;他們將它用於Unicode字符_storage_,並且存在很大差異。 – 2012-03-18 10:46:25

+0

[std :: wstring VS std :: string]可能的重複(http://stackoverflow.com/questions/402283/stdwstring-vs-stdstring) – 2012-03-18 10:46:51

回答

10

如果你知道你在處理unicode,那麼charwchar_t都不合適,因爲它們的大小是編譯器/平臺定義的。例如,wchar_t在Windows(MSVC)上爲2個字節,而在Linux(GCC)上爲4個字節。 C11和C++ 11標準已經更加嚴格一些,並且定義了兩個新的字符類型(char16_tchar32_t),並帶有用於創建UTF- {8,16,32}字符串的相關字面前綴。

如果您需要存儲和操作unicode字符,則應該使用專爲該作業設計的庫,因爲C11之前的版本和pre-C++ 11語言標準都不是用unicode編寫的。有一個few to choose from,但ICU是相當流行(並支持C,C++和Java)。

+3

即使C++ 11在unicode上也很輕鬆。除了強制要求utf8/16/32之間的幾種類型和標準轉換之外,您不會發現任何類似於排序規則,比較,歸一化等等。 – 2012-03-18 11:06:39

+0

就像一個補充,我認爲C11在這裏試圖與C++ 1同步,引入了相同的新的'char ?? _ t'類型。 – 2012-03-18 11:18:04

+0

是的,C11與這些類型/文字的C++ 11同步。 – 2012-03-18 11:22:24

0

我寫軟件 ,充分利用Unicode時我在POSIX遵守特別感興趣。

在這種情況下,您可能希望使用UTF-8(與char)作爲首選的Unicode字符串類型。POSIX沒有很多與wchar_t —一起工作的功能,這主要是Windows的事情。

此方法掃描字節相當於一個Unicode字符。 Unicode歐元符號€ 佔用3個字節。因此,需要比較 三個字符數組字節,以確定Unicode字符是否匹配。通常您需要知道要比較的字符或字符串的大小,以及它爲解決方案工作產生的位數。

不,你不知道。你只是比較字節。如果字節匹配,字符串匹配。與其他編碼一樣,strcmp與UTF-8一樣合適。

除非您想要類似於不區分大小寫或不區分重音的比較,在這種情況下您需要一個適當的Unicode庫。

0

你永遠不應該比較字節,甚至代碼點來判斷字符串是否相等。這是因爲從用戶角度來看,很多字符串可能是相同的,而不是從代碼點的角度來看是相同的。