字符串类实现的差异

时间:2011-12-27 21:46:10

标签: c++ string utf-8 implementation utf-16

为什么字符串类以几种不同的方式实现,优点和缺点是什么?我已经看到它做了几种不同的方式

  1. 仅使用简单的char(最基本的方式)。
  2. 通过模板化字符串支持UTF8和UTF16,例如string<UTF8>UTF8charUTF16unsigned short的位置。
  3. 在字符串类中同时包含UTF8和UTF16。
  4. 还有其他方法可以实现更好的字符串类吗?

1 个答案:

答案 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字符串。

  1. 使用足够大的类型将任何字符组合成单个字符串元素(例如,在linux上看sizeof(wchar_t) == 4是很正常的),这样你就可以享受“好处”(基本上,简单字符串长度计算,没有别的)std::string - 类似的类。
  2. 或者使用可变长度编码(每个字符为UTF8 - 1..4字节或每个字符为UTF16 - 2..4字节),以及提供字符串操作例程的经过良好测试的字符串类。
  3. 只要您不使用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”应该有多大。