我的C++項目目前大約有16K行代碼,我承認完全沒有想過unicode支持。C++:使我的項目支持unicode
我所做的全部都是std::string
的自定義typedef作爲String
並跳轉到編碼中。
我從來沒有真正與unicode一起在我編寫的程序中使用unicode。
現在把我的項目切換到unicode有多難?這是一個好主意嗎?
我可以切換到
std::wchar
而沒有任何重大問題嗎?
我的C++項目目前大約有16K行代碼,我承認完全沒有想過unicode支持。C++:使我的項目支持unicode
我所做的全部都是std::string
的自定義typedef作爲String
並跳轉到編碼中。
我從來沒有真正與unicode一起在我編寫的程序中使用unicode。
現在把我的項目切換到unicode有多難?這是一個好主意嗎?
我可以切換到std::wchar
而沒有任何重大問題嗎?
可能使應用程序支持Unicode的最重要的部分是跟蹤你的字符串的編碼,並確保您的公共接口很好的說明,方便與您希望使用的編碼使用。
切換到更寬字符(在C++ wchar_t
中)不一定是正確的解決方案。事實上,我會說它通常不是最簡單的解決方案。一些應用程序可以通過指定所有的字符串和接口使用UTF-8而不需要改變。 std::string
可以很好地用於UTF-8編碼的字符串。但是,如果您需要使用非UTF-8接口來解釋字符串或接口中的字符,那麼您將不得不進行更多的工作,但不知道更多關於應用程序的信息,不可能推薦一種最佳方法。
使用std::wstring
有一些問題。如果您的應用程序將以Unicode格式存儲文本,並且它將在不同的平臺上運行,那麼您可能會遇到麻煩。 std::wstring
依賴於編譯器相關的wchar_t
。在Microsoft Visual C++中,此類型的寬度爲16位,因此僅支持UTF-16編碼。 GNU C++編譯器將此類型指定爲32位寬,因此僅支持UTF-32編碼。如果你將文本存儲在一個系統(比如Windows/VC++)的文件中,然後從另一個系統(Linux/GCC)讀取文件,你必須爲此做好準備(在這種情況下,將UTF-16轉換爲UTF-32)。
「這種類型是16位寬,因此只支持UTF-16編碼」。這是不正確的。與固定寬度的16位字符不同,UTF-16 *支持大於2^16的代碼點。 – 2011-03-13 14:55:37
我不是在談論代碼點,我在談論代碼點的編碼。我認爲你把UTF-16和UCS-2搞混了。如果不是,我不知道你在說什麼。 – 2011-03-13 21:10:54
我的不好,我誤解了你的意思是'只支持UTF-16編碼'。 – 2011-03-14 09:12:39
我可以在沒有任何重大問題的情況下切換到[
std::wchar_t
]嗎?
不,不是那麼簡單。
wchar_t
字符串的編碼是平臺相關的。 Windows使用UTF-16。 Linux通常使用UTF-32。如果您需要支持類Unix系統(C++ 0x中會減輕通過引入獨立的char16_t
和char32_t
類型的這種差異。)_wfopen
等wchar_t
?char
編碼)比UTF-16/32你必須轉換這些。wchar_t
char
因爲C++混淆「字符」和「字節」,你必須確定哪些char
s爲字符和char
s爲字節。
std :: wchar不等同於unicode。 – Erik 2011-03-13 11:10:42
@Erik:現在,如果只有微軟會改變他們的文檔來反映這個... – dan04 2011-03-15 00:33:42