我目前正在開發一個適用於Windows和Linux的愛好項目(C/C++),並且完全支持Unicode。可悲的是,Windows和Linux使用不同的編碼,使我們的生活更加困難。C/C++中的跨平臺unicode:使用哪種編碼?
在我的代碼中,我試圖使用盡可能通用的數據,這使得Windows和Linux都很容易。在Windows中,默認情況下,wchar_t編碼爲UTF-16,Linux中編碼爲UCS-4(如果我錯了,請糾正我)。
我的軟件打開({_wfopen,UTF-16,Windows},{fopen,UTF-8,Linux})並將數據寫入UTF-8文件。到目前爲止,這都是可行的。直到我決定使用SQLite。
SQLite的C/C++接口允許使用一個或兩個字節的編碼字符串(click)。 Ofcourse這不適用於Linux中的wchar_t,因爲Linux中的wchar_t默認爲4字節。因此,從sqlite寫入和讀取需要轉換爲Linux。
目前代碼混亂,Windows/Linux的例外情況。我希望能堅持到wchar_t的存儲數據的標準理念:
- wchar_t的在Windows:文件路徑不會有問題,讀/寫沒有問題的SQLite。無論如何,將數據寫入文件應該使用UTF-8編寫。
- wchar_t在Linux中:由於UTF-8編碼,在讀取/寫入到sqlite(wchar_t)之前進行轉換以及在將數據寫入文件時與windows相同的文件路徑的例外。
閱讀後(here)我確信我應該堅持在Windows中使用wchar_t。但是,在完成所有這些工作之後,麻煩從移植到Linux開始。
目前我正在考慮重做一切以堅持使用簡單字符(UTF-8),因爲它適用於Windows和Linux,記住我需要'WideCharToMultiByte'Windows中的每個字符串來實現UTF-8。使用簡單的基於char *的字符串將大大減少Linux/Windows的例外數量。
你有任何使用unicode跨平臺的經驗嗎?對使用UTF-8簡單地存儲數據而不是使用wchar_t的想法有什麼想法?
2字節字符編碼絕對是*不* UTF-16。UTF-16是2到4個字節,而UTF-8是1到4個字節。 Windows'wchar_t'不是UTF-16,它是UCS2。在實踐中,您可能沒有注意到這種差異,因爲UCS2涵蓋了BMP,但是如果您的用戶決定他們必須擁有Ogham或符文數據... – user268396
Windows使用UTF-16,並且使用'wchar_t'來保存UTF-16數據,並且自Windows 2000以來一直這樣做。 –
關於wchar_t的用途和用途:http://stackoverflow.com/a/11107667/365496 – bames53