2016-12-19 67 views
1

我將應用程序從Windows移植到Linux,並且遇到了字符編碼的問題:我看到重音字母(例如'é''à')被認爲是wchar_t(4個字節,帶有g ++),而在Visual Studio中, 1個字節(char)。我的單元測試失敗了,因爲在我的代碼中我使用重音字母進行字符比較(如在Linux中它們是多字節)。如何將重音字母(wchar_t)轉換爲char?

是否可以在Linux中將重音字母(如'û')轉換爲Windows編碼(1字節),還是應該重構我的代碼並使用std::wstring代替?

+2

'wchar_t'在Windows上是2個字節(UTF-16),在其他系統上是4個字節(UTF-32)。如果數據確實使用1個字節的字符,那麼它使用'char'來代替,因此需要處理字符集代碼頁。要將其移植到Linux,您應該將數據重新編碼爲UTF編碼(8,16或32),然後使用便攜式Unicode比較。 –

+0

法語重音字母大小是我的Windows系統上的一個字節(char),這就是爲什麼在我的代碼中我可以在字符比較中使用它們(例如if(strMystring [i] =='é')...)Linux文本編輯器與原始編碼混淆,現在我的單元測試失敗了,所以我有義務找到合適的便攜式解決方案。 – Aminos

+2

'如果(strMystring [i] =='é')'只有在'strMystring'是一個拉丁編碼的8位字符串並且源文件本身以拉丁編碼匹配時才起作用。這不是一個非常便攜的設置。我絕對不建議使用窄字符串比較非ASCII數據,因爲這是特定於語言環境的,除非您使用的是UTF-8。改用寬字符串。 –

回答

1

如果'é'可以存儲在Windows上的一個字符上,那麼您的應用程序可能編譯時沒有UNICODE,當然編碼也是Win 1252

隨着Linux上通常的utf-8編碼,'é' should require 2 characters。這應該會導致編譯器的警告。如果你使用獲得的字符,它將只代表編碼的一部分,所以char by char比較將是沒有意義的。

如果你想讓你的算法,使用字符串的單個字符,你最好與wchar_twstring(或事件更便攜:char32_tu32string)工作。

如果您想了解更多關於字符編碼和unicode的C++,我只能熱烈推薦James McNellis出色的視頻tutorial on unicode with C++