我仍在尝试确定我的(home)项目是否应该使用UTF-8字符串(在必要时使用std :: string和其他特定于UTF-8的函数实现)或一些16位字符串(实现为std :: wstring)。该项目是一种编程语言和环境(如VB,它是两者的组合)。
有一些愿望/限制:
目前,我正在使用std :: string,目的是仅在必要时使用UTF-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之间传递字符串时,它会更容易。