繁体   English   中英

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

[英]C++ strings: UTF-8 or 16-bit encoding?

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

有一些愿望/约束:

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

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

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

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

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

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

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

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

我实际上已经编写了一个广泛使用的应用程序(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öö只在(不可见)标准化方面有所不同。

我建议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,但不要混合搭配,这就是要求麻烦。

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

根据我的阅读,最好在内部使用16位编码,除非你的内存不足。 它几乎适合所有生活语言的一个角色

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM