为什么字符串类以几种不同的方式实现,优点和缺点是什么?我已经看到它做了几种不同的方式
char
(最基本的方式)。string<UTF8>
。 UTF8
为char
且UTF16
为unsigned short
的位置。还有其他方法可以实现更好的字符串类吗?
答案 0 :(得分:2)
据我所知std::basic_string<wchar_t>
,其中sizeof(wchar_t) == 2
不是UTF16编码。在unicode中有超过2 ^ 16个字符,并且代码至少达到0xFFFFF
,即&gt; 0xFFFF
(2字节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>
不是因此,这是一个完美的解决方案。
渲染国际化文本是PAIN,所以最好的想法就是抓住任何与unicode兼容的字符串类(如QString),希望它带有文本布局引擎(可以正确处理控制字符和双向)而是专注于更有趣的编程问题。
-Update -
如果unsigned short不是UTF16,那么unsigned int是什么?什么是UTF8呢?那是unsigned char吗?
UTF16 是可变长度 字符编码。 UTF16每个字符使用1 .. 2 2字节(即uint16_t
,16位)元素。即UTF16字符串中的元素数!= UTF16字符串中的字符数。您无法通过计算元素来计算字符串长度。
UTF8 是另一种可变长度编码,基于1字节元素(8位,1字节或“unsigned char”)。 UTF8中的一个unicode字符(“代码点”)需要1 .. 4 uint8_t
个元素。再次,字符串中的元素数量!=字符串中的字符数。 UTF8的优点是ASCII中存在的字符在UTF8中每个字符恰好占用1个字节,这节省了一些空间,而在UTF16中,字符总是至少占用2个字节。
UTF32 是固定长度 字符编码,每个字符始终使用32位(4个字节或uint32_t
)。目前任何unicode字符都可以放入单个UTF32元素中,UTF32可能会长时间保持固定长度(我不认为地球的所有语言组合都会产生2 ^ 31个不同的字符)。它浪费了更多的内存,但是字符串中的元素数= =字符串中的字符数。
另外,请记住,C ++标准没有指定“int”或“short”应该有多大。