我想了解char
和wchar_t
之間的區別嗎?據我所知,wchar_t
使用更多的字節,但我可以得到一個明確的例子來區分的時候,我會用char
VS wchar_t
char vs wchar_t何時使用哪種數據類型
回答
從根本上說,使用wchar_t
當編碼具有比char
更多的符號可以包含。
背景
的char
類型具有足夠的容量來保持在ASCII字符集的任何字符(編碼)。
問題是許多語言都需要比ASCII碼更多的編碼。因此,不需要127種可能的編碼,需要更多。某些語言有超過256種可能的編碼。 A char
類型不保證大於256的範圍。因此需要新的數據類型。
wchar_t
,又名寬字符,爲編碼提供了更多的空間。
摘要當編碼的範圍爲256或更小,例如ASCII
使用char
數據類型。當您需要的容量超過256時,請使用wchar_t
。
更喜歡Unicode來處理大型字符集(例如emojis)。
'wchar_t'處理4個字節的表情符號嗎? – tadman
使用以下語句查找:'std :: cout << sizeof(wchar_t)<<「\ n」;'。如果它打印少於4,那麼你的答案是「否」。 –
使用Unicode的首選方式是使用['char16_t'和'char32_t'](http://en.cppreference.com/w/cpp/language/types#Character_types),因爲它們具有已知的大小和範圍。 –
千萬不要使用wchar_t
。
如果可能,請使用char
(某種數組),例如std::string
,並確保它以UTF-8編碼。
當你必須使用不講UTF-8,使用char16_t
或char32_t
的API接口。千萬別使用它們;它們只提供虛幻的優勢並鼓勵錯誤的代碼。
注意,有一個以上char32_t
需要代表單個用戶可見的字符的情況下大量。 OTOH,使用UTF-8和char
強制你儘早處理可變寬度。
某些Windows API需要'wchar_t',但在Windows上,您知道'wchar_t'是16位,並且具有一定的穩定性。 'char32_t' *可以表示所有的Unicode字符,這可能只是用戶認爲字符的一個子集,但有些時候它是有用的。我同意,''char16_t'可能僅在與期望使用UTF-16的系統進行接口時纔有用。 –
短anwser:
在現代C你不應該使用的wchar_t ++,與特定的OS的API進行交互時除外(基本上只使用wchar_t的調用Windows API函數)。
龍答:
標準C++設計庫意味着只有一個處理Unicode的方式 - 通過存儲UTF-8編碼字符串的字符數組,因爲幾乎只有在煤焦變種,所有功能(思std :: exception :: what)。
在C++程序中有兩個區域設置: - 標準C庫的語言環境設置的std ::的setlocale - 標準C++庫的語言環境的std ::現場::全球
不幸的是,他們沒有定義設置標準函數打開文件的行爲(如std :: fopen,std :: fstream :: open等)。行爲操作系統之間是不同的: - Linux是編碼無關,所以那些功能簡單的字符字符串傳遞給底層的系統調用 - 在Windows字符字符串中使用用戶特定的語言環境轉換成寬字符串由系統調用之前
一切通常工作因爲每個人都使用基於UTF-8的語言環境,因此傳遞給main()函數的所有用戶輸入和參數都將使用UTF-8編碼。但是您可能仍然需要顯式地將當前區域設置切換爲UTF-8變體,因爲默認情況下,C++程序將使用默認的「C」區域設置開始。此時,如果您只關心Linux並且不需要支持Windows,則可以使用char數組和std :: string,假設它是UTF-8序列,並且所有內容都「正常工作」。
當您想要支持Windows時會出現問題,因爲在這裏您總是會有其他第三地區:爲當前用戶設置的一個地區,可以在「控制面板」中的某處進行配置。主要問題是這個語言環境永遠不是unicode語言環境,所以它是不可能使用std :: fopen(const char *)和std :: fstream :: open(const char *)等函數來打開文件unicode路徑。在Windows上,您將不得不使用定製包裝器,這些包裝器在Windows上使用非標準Windows特定函數,如_wfopen,std :: fstream :: open(const wchar_t *)。您可以檢查Boost.Nowide(尚未包含在Boost中)以瞭解如何執行此操作:http://cppcms.com/files/nowide/html/
使用C++ 17,您可以使用std :: filesystem :: path以便攜方式存儲文件路徑,但它仍然是打破在Windows上:
- 隱式構造的std ::文件系統::路徑::路徑(爲const char *)採用了MSVC用戶特定的語言環境和有沒有辦法讓它使用UTF-8 。函數std :: filesystem :: u8string應該用來構造來自UTF-8字符串的路徑,但是很容易忘記這一點,而使用隱式構造。
- std :: error_category :: message(int)爲這兩個錯誤類別返回錯誤描述使用用戶特定的enconding。
因此,我們必須在Windows上的是:
- 標準庫函數打開的文件被破壞,絕不應該被使用。
- 傳遞給main(int,char **)的參數被打破,不應該被使用。
- 以* A和宏結尾的WinAPI函數已損壞,不應使用。
- std :: filesystem :: path被部分破壞,不應該直接使用。
- 由std :: generic_category和std :: system_category返回的錯誤類別已損壞,不應使用。
如果你需要一個不平凡的項目長期的解決辦法,我建議:
- 使用Boost.Nowide或直接實現類似的功能 - 這打破固定的標準庫。
- 重新實現由std :: generic_category()和std :: system_category()返回的標準錯誤類別,以便它們始終返回UTF-8編碼的字符串。
- 包裝std :: filesystem :: path,以便在將路徑轉換爲字符串和字符串到路徑時,新類始終使用UTF-8。
- 從std :: filesystem中包裝所有必需的函數,以便它們使用路徑包裝器和錯誤類別。
不幸的是,這不會解決其他使用文件的庫的問題,但99%的文件都被破壞了(不支持unicode)。
這就是C++程序員的生活。微軟可以通過允許我們將Windows運行時切換到基於UTF-8的區域設置來解決此問題,但它們不會因爲向後兼容。
您可以檢查這個環節作進一步的解釋:http://utf8everywhere.org/
- 1. char vs wchar_t
- 2. Const char * vs const wchar_t *(concatenation)
- 3. 要使用哪種數據類型?
- 4. 使用大分數時要使用哪種數據類型?
- 5. SQL何時使用哪種數據類型
- 6. MYSQL列中的9,000個char字符串 - 要使用哪種數據類型?
- 7. 瞭解將使用哪種swprintf(或再次將char *字符串轉換爲wchar_t *)
- 8. 哪種數據類型在gorm中使用時間?
- 9. 何時使用哪種數據結構?
- 10. 如何確定輸出時使用哪種類型的聯合?
- 11. mysql ---我應該使用哪種類型?
- 12. 這種類型的數據格式使用哪種數據結構?
- 13. 我比較哪種數據類型?
- 14. 這是哪種類型的數據?
- 15. 分辨率的哪種數據類型
- 16. HTML的哪種數據類型?
- 17. 哪種數據類型選擇?
- 18. char,wchar_t和unichar
- 19. 我使用哪種Swift數據類型用於貨幣
- 20. 哪種數據類型用於存儲用戶數據?
- 21. char * to wchar_t *函數實現
- 22. 使用二進制數據塊時,您應該在C++中使用哪種數據類型?
- 23. 何時使用哪種類型的通用接口定義?
- 24. 我應該爲我的列使用哪種數據類型? [MySQL]
- 25. 要使用哪種MySQL數據類型進行調度?
- 26. 澄清要使用哪種數據類型
- 27. 我可以使用哪種數據類型?
- 28. 不確定要使用哪種MySQL數據類型
- 29. 實現功能結構:使用哪種數據類型?
- 30. 在java中使用哪種數據類型?
[這裏是SO線程這個問題(https://stackoverflow.com/questions/19532785/difference-between-char-and-wchar- t) –
該線程更具有MS特定性。讓這個獲得更一般的「標準C++」答案可能會很方便。 –
一些更有用的[鏈接](https://stackoverflow.com/questions/23136837/in-c-when-to-use-wchar-and-when-to-use-char) –