代码之家  ›  专栏  ›  技术社区  ›  Carl Seleborg

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

  •  12
  • Carl Seleborg  · 技术社区  · 16 年前

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

    有几个愿望/限制:

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

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

    UTF-16 ? UCS-2 ? 另一个?

    8 回复  |  直到 13 年前
        1
  •  26
  •   Nick Johnson    16 年前

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

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

        2
  •  6
  •   Vargen    16 年前

        3
  •  5
  •   Nemanja Trifunovic    16 年前

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

        4
  •  4
  •   MSalters    16 年前

    请注意,std::wstring是Mac上的本机Unicode(U+10000以上的字符不需要UTF-16),因此它使用4字节/wchar\t。这样做的最大优点是,i++始终为您提供下一个字符。在Win32上,只有99.9%的情况下是这样。作为一名程序员,你会明白99.9%是多么的少。

    磁盘格式是另一回事。对于可移植性,应该是UTF-8。UTF-8中没有端部问题,也没有讨论宽度(2/4)。这可能是许多程序似乎使用UTF-8的原因。

        5
  •  2
  •   Peter Mortensen icecrime    14 年前

    我推荐UTF-16用于任何类型的数据操作和UI。 Mac OS X和Win32 API使用UTF-16,wxWidgets、Qt、ICU、Xerces和其他应用程序也使用UTF-16。 UTF-8可能更适合于数据交换和存储。 看见 http://unicode.org/notes/tn12/ .

        6
  •  2
  •   Peter Mortensen icecrime    14 年前

    MicroATX几乎是一种标准PC主板格式,最多支持4-8GB的RAM。如果你说的是PicoAX,可能你的内存限制在1-2GB。即便如此,对于开发环境来说,这已经足够了。出于上述原因,我仍然坚持使用UTF-8,但内存不应该是您关心的问题。

        7
  •  1
  •   Branan    16 年前

    我还想看看 ICU

        8
  •  0
  •   Ferruccio    16 年前

    您考虑过使用wxstring吗?如果我没记错的话,他们可以做utf-8<-&燃气轮机;Unicode转换,当您必须向UI传递字符串和从UI传递字符串时,这将使它变得更容易。