簡體   English   中英

C ++字符串:UTF-8還是16位編碼?

[英]C++ strings: UTF-8 or 16-bit encoding?

我仍在嘗試決定我的(home)項目是否應該使用UTF-8字符串(在必要時使用std :: string和其他特定於UTF-8的函數實現)或一些16位字符串(實現為std: :wstring的)。 該項目是一種編程語言和環境(如VB,它是兩者的結合)。

有一些願望/約束:

  • 如果它可以在有限的硬件上運行,例如內存有限的計算機,那將會很酷。
  • 我希望代碼能夠在Windows,Mac和(如果資源允許的話)Linux上運行。
  • 我將使用wxWidgets作為我的GUI層,但我希望與該工具包交互的代碼限制在代碼庫的一角(我將擁有非GUI可執行文件)。
  • 在處理用戶可見文本和應用程序數據時,我想避免使用兩種不同的字符串。

目前,我正在使用std :: string,目的是僅在必要時使用UTF-8操作函數。 它需要更少的內存,似乎是許多應用程序正在進行的方向。

如果你推薦一個16位編碼,哪一個: UTF-16 UCS-2 另一個?

UTF-16仍然是一個可變長度的字符編碼(有超過2 ^ 16個unicode代碼點),因此你不能做O(1)字符串索引操作。 如果你做了很多這樣的事情,你就不會在速度上超過UTF-8。 另一方面,如果您的文本包含256-65535范圍內的許多代碼點,則UTF-16的大小可以大幅提升。 UCS-2是UTF-16的變體,它固定長度的,代價是禁止任何大於2 ^ 16的代碼點。

如果不了解您的要求,我個人會選擇UTF-8。 由於其他人已經列出的所有原因,這是最容易處理的。

說實話,我從來沒有找到任何理由使用UTF-8以外的任何東西。

如果您決定使用UTF-8編碼,請查看此庫: http//utfcpp.sourceforge.net/

它可能會讓你的生活更輕松。

我實際上已經編寫了一個廣泛使用的應用程序(500萬+用戶),所以每千字節使用的數字相加。 盡管如此,我只是堅持使用wxString。 我已經將它配置為從std :: wstring派生,所以我可以將它們傳遞給期望wstring const&的函數。

請注意,std :: wstring是Mac上的原生Unicode(U + 10000以上的字符不需要UTF-16),因此它使用4個字節/ wchar_t。 這樣做的一大優點是i ++總能讓你成為下一個角色。 在Win32上,只有99.9%的情況屬實。 作為一名程序員,你會明白99.9%是多少。

但如果您不相信,請將函數寫入大寫std :: string [UTF-8]和std :: wstring。 這兩個功能會告訴你哪種方式是精神錯亂。

您的磁盤格式是另一回事。 為了便於攜帶,那應該是UTF-8。 UTF-8中沒有字節順序,也沒有關於寬度的討論(2/4)。 這可能是許多程序似乎使用UTF-8的原因。

稍微不相關的說明,請閱讀Unicode字符串比較和規范化。 或者你最終會遇到與.NET相同的錯誤,在這個錯誤中你可以有兩個變量föö和föö只在(不可見)標准化方面有所不同。

我建議UTF-16用於任何類型的數據操作和UI。 Mac OS X和Win32 API使用UTF-16,對於wxWidgets,Qt,ICU,Xerces等也是如此。 UTF-8可能更適合數據交換和存儲。 http://unicode.org/notes/tn12/

但無論你選擇什么,我肯定會建議只在必要時使用UTF-8來反對std :: string。

一直使用UTF-16或UTF-8,但不要混合搭配,這就是要求麻煩。

MicroATX幾乎是標准的PC主板格式,大多數能夠支持4-8 GB的RAM。 如果你正在談論picoATX,你可能只限於1-2 GB RAM。 即使這樣,對於開發環境來說也是如此。 由於上面提到的原因,我仍然堅持使用UTF-8,但記憶不應該是你關注的問題。

根據我的閱讀,最好在內部使用16位編碼,除非你的內存不足。 它幾乎適合所有生活語言的一個角色

我也看看ICU 如果您不打算使用字符串的某些STL功能,則使用ICU字符串類型可能更適合您。

你考慮過使用wxStrings嗎? 如果我沒記錯的話,他們可以進行utf-8 < - > Unicode轉換,當你必須在UI之間傳遞字符串時,它會變得更容易一些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM