2011-12-27 78 views
3

爲什麼字符串類以幾種不同的方式實現以及有哪些優缺點?我已經看到它做了幾種不同的方式字符串類實現的差異

  1. 只使用一個簡單的char(最基本的方式)。
  2. 通過模板化字符串(例如string<UTF8>)支持UTF8和UTF16。其中UTF8charUTF16unsigned short
  3. 在字符串類中同時包含UTF8和UTF16。

是否有任何其他方法來實現可能更好的字符串類?

+3

沒有完美的字符串類。性能,資源使用和普遍性是相互衝突的目標。選擇在您的操作系統及其支持庫上流行的一款,以免浪費時間編寫轉換代碼。請不要寫你自己的字符串類,已經足夠了。 – 2011-12-27 22:03:26

+0

我知道有很多字符串類,我想寫一個用於學習的目的。確實有不同的方式去學習,但我有時間花在學習寫我自己的,但我只是不確定迄今爲止的差異。 – mmurphy 2011-12-27 22:06:22

+0

@mmurphy:「我想寫一個用於學習的目的」。對我而言,「邊幹邊學」通常會更有成效,可以寫出我希望寫的新東西(有趣)或我必須寫的東西(工作),而不是爲了「學習目的」選擇難懂的任務。你的大腦會忘記你沒有使用或沒有感興趣的所有東西,並且使另一個字符串容器不是一個驚心動魄的事情。 – SigTerm 2011-12-27 23:37:25

回答

2

據我所知std::basic_string<wchar_t>其中sizeof(wchar_t) == 2不是UTF16編碼。 unicode中有超過2^16個字符,並且代碼至少達到0xFFFFF,這是>0xFFFF(2byte wchar_t容量)。因此,正確的UTF16應該使用每個字母的可變字節數(一個2字節wchar_t或其中兩個字節),這與std::basic_string以及假設one string element == one character的類似類不同。

據我所知有兩種方法可以處理unicode字符串。

  1. 要麼使用足夠大的類型,以適應任何字符到一個字符串元素(例如,在Linux上這是很正常的,看sizeof(wchar_t) == 4),這樣你就可以享受「福利」(基本上,容易串長度計算,沒有別的)std::string類的類。
  2. 或使用可變長度編碼(每個字符爲UTF8-1..4個字節或UTF16-2.4個字節),以及經過充分測試的字符串類,它提供字符串操作例程。

只要你不使用char你使用哪種方法並不重要。 char基於字符串的字符串可能會在具有不同8位代碼頁的計算機上造成麻煩,如果您不小心處理該問題(可以安全地認爲您會忘記它並且不會很小心 - Microsoft Applocale是由於某種原因而創建的)。

Unicode包含大量不可打印的字符(unicode中的控制和格式化字符),所以幾乎可以擊敗#1可以提供的任何好處方法。無論如何,如果您決定使用方法#1,您應該記住wchar_t不足以在某些編譯器/平臺(windows/microsoft編譯器)上適合所有可能的字符,並且因此std::basic_string<wchar_t>不是一個完美的解決方案。


呈現國際化的文本是痛苦,所以最好的辦法是隻抓住任何兼容Unicode字符串類(如QString)還有就是希望自帶的文字排版引擎(即能夠妥善處理控制字符和雙向文本),而是專注於更有趣的編程問題。


-Update-

如果無符號短不UTF16,又是什麼,unsigned int類型?什麼是UTF8呢?那是無符號的字符?

UTF16可變長度字符編碼。 UTF16使用1個字符的2字節(即uint16_t,16位)元素。即UTF16字符串中元素的數量!= UTF16字符串中字符的數量。您不能通過計算元素來計算字符串長度。

UTF8是另一個可變長度編碼,基於1個字節元件(8位,1個字節或 「無符號字符」)。 UTF8中的一個Unicode字符(「代碼點」)需要1 .. uint8_t元素。再一次,字符串中的元素數量!=字符串中的字符數量。 UTF8的優點是ASCII中存在的字符在UTF8中每個字符只需1個字節,這節省了一些空間,而在UTF16中,字符總是至少需要2個字節。

UTF32固定長度字符編碼,總是每個字符采用32位(4個字節或uint32_t)。目前,任何unicode字符都可以放入單個UTF32元素中,並且UTF32可能會長時間保持固定長度(我認爲地球上的所有語言都不會產生2^31個不同的字符)。它浪費更多的內存,但字符串中的元素數==字符串中的字符數。

另外,請記住,C++標準沒有指定「int」或「short」應該有多大。

+0

如果unsigned short不是UTF16,那麼unsigned int是什麼?什麼是UTF8呢?那是無符號的字符? – mmurphy 2011-12-28 08:16:46

+0

@mmurphy:回答更新 – SigTerm 2011-12-29 18:02:07

+0

謝謝你的幫助,這絕對清除了事情。 – mmurphy 2011-12-30 00:03:52