2011-12-27 44 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