C ++字符串:UTF-8还是16位编码?

时间:2008-09-19 16:15:56

标签: c++ encoding utf-8 stdstring ucs2

我仍在尝试确定我的(home)项目是否应该使用UTF-8字符串(在必要时使用std :: string和其他特定于UTF-8的函数实现)或一些16位字符串(实现为std :: wstring)。该项目是一种编程语言和环境(如VB,它是两者的组合)。

有一些愿望/限制:

  • 如果可以在有限的硬件上运行,例如内存有限的计算机,那将会很酷。
  • 我希望代码能够在Windows,Mac和(如果资源允许的话)Linux上运行。
  • 我将使用wxWidgets作为我的GUI层,但我希望将与该工具包交互的代码限制在代码库的一角(我将拥有非GUI可执行文件)。
  • 在使用用户可见文本和应用程序数据时,我想避免使用两种不同的字符串。

目前,我正在使用std :: string,目的是仅在必要时使用UTF-8操作函数。它需要更少的内存,并且似乎是许多应用程序正在进行的方向。

如果您推荐16位编码,哪一个:UTF-16UCS-2?另一个?

8 个答案:

答案 0 :(得分:26)

UTF-16仍然是一个可变长度字符编码(有超过2 ^ 16个unicode代码点),因此你不能做O(1)字符串索引操作。如果你做了很多这样的事情,你就不会在速度上超过UTF-8。另一方面,如果您的文本包含256-65535范围内的许多代码点,则UTF-16的大小可以大幅提升。 UCS-2是UTF-16的一种变体,固定长度,代价是禁止任何大于2 ^ 16的代码点。

在不了解您的要求的情况下,我个人会选择UTF-8。由于其他人已经列出的所有原因,这是最容易处理的。

答案 1 :(得分:6)

说实话,我从来没有找到任何理由使用UTF-8以外的任何东西。

答案 2 :(得分:5)

如果您决定使用UTF-8编码,请查看此库:http://utfcpp.sourceforge.net/

它可能会让你的生活更轻松。

答案 3 :(得分:4)

我实际上已经编写了一个广泛使用的应用程序(500万+用户),所以每千字节使用的字面数加起来。尽管如此,我只是坚持使用wxString。我已将其配置为从std :: wstring派生,因此我可以将它们传递给期望wstring const&的函数。

请注意,std :: wstring是Mac上的原生Unicode(U + 10000以上的字符不需要UTF-16),因此它使用4个字节/ wchar_t。这样做的一大优点是i ++总能让你成为下一个角色。在Win32上,只有99.9%的情况属实。作为一名程序员,你会明白99.9%是多少。

但如果您不相信,请将函数编写为大写std :: string [UTF-8]和std :: wstring。这两个功能会告诉你哪种方式是精神错乱。

您的磁盘格式是另一回事。为了便于携带,那应该是UTF-8。 UTF-8中没有字节顺序,也没有关于宽度的讨论(2/4)。这可能是许多程序似乎使用UTF-8的原因。

稍微不相关的说明,请阅读Unicode字符串比较和规范化。或者你最终会得到与.NET相同的错误,在这个错误中你可以有两个变量föö和föö只在(不可见)标准化方面有所不同。

答案 4 :(得分:2)

我建议UTF-16用于任何类型的数据操作和UI。 Mac OS X和Win32 API使用UTF-16,对于wxWidgets,Qt,ICU,Xerces等也是如此。 UTF-8可能更适合数据交换和存储。 请参阅http://unicode.org/notes/tn12/

但无论你选择什么,我肯定会建议只在必要时使用UTF-8反对std :: string。

使用UTF-16或UTF-8一直走,但不要混淆,这就是要求麻烦。

答案 5 :(得分:2)

MicroATX几乎是标准的PC主板格式,大多数能够支持4-8 GB的RAM。如果你正在谈论picoATX,你可能只限于1-2 GB RAM。即使这样,对于开发环境来说也是如此。出于上述原因,我仍然坚持使用UTF-8,但记忆不应该是你关注的问题。

答案 6 :(得分:1)

从我读过的内容来看,最好在内部使用16位编码,除非你的内存不足。它适用于几乎所有生活语言的一个角色

我也会看ICU。如果您不打算使用字符串的某些STL功能,那么使用ICU字符串类型可能更适合您。

答案 7 :(得分:0)

你考虑过使用wxStrings吗?如果我没记错的话,他们可以做utf-8< - > Unicode转换,当你必须在UI之间传递字符串时,它会更容易。