爲什麼字符串類以幾種不同的方式實現以及有哪些優缺點?我已經看到它做了幾種不同的方式字符串類實現的差異
- 只使用一個簡單的
char
(最基本的方式)。 - 通過模板化字符串(例如
string<UTF8>
)支持UTF8和UTF16。其中UTF8
是char
和UTF16
是unsigned short
。 - 在字符串類中同時包含UTF8和UTF16。
是否有任何其他方法來實現可能更好的字符串類?
爲什麼字符串類以幾種不同的方式實現以及有哪些優缺點?我已經看到它做了幾種不同的方式字符串類實現的差異
char
(最基本的方式)。string<UTF8>
)支持UTF8和UTF16。其中UTF8
是char
和UTF16
是unsigned short
。是否有任何其他方法來實現可能更好的字符串類?
據我所知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字符串。
sizeof(wchar_t) == 4
),這樣你就可以享受「福利」(基本上,容易串長度計算,沒有別的)std::string
類的類。只要你不使用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」應該有多大。
沒有完美的字符串類。性能,資源使用和普遍性是相互衝突的目標。選擇在您的操作系統及其支持庫上流行的一款,以免浪費時間編寫轉換代碼。請不要寫你自己的字符串類,已經足夠了。 – 2011-12-27 22:03:26
我知道有很多字符串類,我想寫一個用於學習的目的。確實有不同的方式去學習,但我有時間花在學習寫我自己的,但我只是不確定迄今爲止的差異。 – mmurphy 2011-12-27 22:06:22
@mmurphy:「我想寫一個用於學習的目的」。對我而言,「邊幹邊學」通常會更有成效,可以寫出我希望寫的新東西(有趣)或我必須寫的東西(工作),而不是爲了「學習目的」選擇難懂的任務。你的大腦會忘記你沒有使用或沒有感興趣的所有東西,並且使另一個字符串容器不是一個驚心動魄的事情。 – SigTerm 2011-12-27 23:37:25