2011-03-13 47 views
7

我的C++項目目前大約有16K行代碼,我承認完全沒有想過unicode支持。C++:使我的項目支持unicode

我所做的全部都是std::string的自定義typedef作爲String並跳轉到編碼中。

我從來沒有真正與unicode一起在我編寫的程序中使用unicode。

  • 現在把我的項目切換到unicode有多難?這是一個好主意嗎?

  • 我可以切換到std::wchar而沒有任何重大問題嗎?

+2

std :: wchar不等同於unicode。 – Erik 2011-03-13 11:10:42

+0

@Erik:現在,如果只有微軟會改變他們的文檔來反映這個... – dan04 2011-03-15 00:33:42

回答

7

可能使應用程序支持Unicode的最重要的部分是跟蹤你的字符串的編碼,並確保您的公共接口很好的說明,方便與您希望使用的編碼使用。

切換到更寬字符(在C++ wchar_t中)不一定是正確的解決方案。事實上,我會說它通常不是最簡單的解決方案。一些應用程序可以通過指定所有的字符串和接口使用UTF-8而不需要改變。 std::string可以很好地用於UTF-8編碼的字符串。但是,如果您需要使用非UTF-8接口來解釋字符串或接口中的字符,那麼您將不得不進行更多的工作,但不知道更多關於應用程序的信息,不可能推薦一種最佳方法。

2

使用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)。

+0

「這種類型是16位寬,因此只支持UTF-16編碼」。這是不正確的。與固定寬度的16位字符不同,UTF-16 *支持大於2^16的代碼點。 – 2011-03-13 14:55:37

+0

我不是在談論代碼點,我在談論代碼點的編碼。我認爲你把UTF-16和UCS-2搞混了。如果不是,我不知道你在說什麼。 – 2011-03-13 21:10:54

+0

我的不好,我誤解了你的意思是'只支持UTF-16編碼'。 – 2011-03-14 09:12:39

1

我可以在沒有任何重大問題的情況下切換到[std::wchar_t]嗎?

不,不是那麼簡單。

  • wchar_t字符串的編碼是平臺相關的。 Windows使用UTF-16。 Linux通常使用UTF-32。如果您需要支持類Unix系統(C++ 0x中會減輕通過引入獨立的char16_tchar32_t類型的這種差異。)
  • ,你沒有Windows有所有的UTF-16的功能,所以你需要編寫自己的_wfopen
  • 您是否使用任何第三方庫?做他們支持wchar_t
  • 儘管寬字符常用用於內存中表示的磁盤上和on-the-Web格式是得多更可能是UTF-8(或其他基於char編碼)比UTF-16/32你必須轉換這些。
  • 你不能只搜索和替換與wchar_tchar因爲C++混淆「字符」和「字節」,你必須確定哪些char s爲字符和char s爲字節。