Unicode - 通常在C++中使用它

Pau*_*han 16 c++ unicode

假设我们有一个任意的字符串,s.

s具有来自世界任何地方的财产.来自美国,日本,韩国,俄罗斯,中国和希腊人民都写入小号不时.幸运的是,我们没有时间旅行者使用线性A.

为了便于讨论,让我们假设我们想要进行字符串操作,例如:

  • 相反
  • 长度
  • 利用
  • 小写
  • 索引到

并且,仅仅因为这是为了讨论,我们假设我们想要自己编写这些例程(而不是抓住一个库),而且我们没有可以维护的遗留软件.

Unicode有3个标准:utf-8,utf-16和utf-32,每个都有利弊.但是,让我说我有点愚蠢,我想要一个Unicode来统治它们(因为为3种不同类型的字符串编码滚动动态适应库,隐藏与API用户的差异听起来很难).

  • 哪种编码最通用?
  • wchar_t支持哪种编码?
  • STL支持哪种编码?
  • 这些编码是否全部(或根本没有)以空值终止?

-

这个问题的关键是要为自己和其他人提供有用和有用的Unicode信息:阅读RFC很好,但是有一堆与RFC不包含的编译器,语言和操作系统有关的信息,但是知道在真实的应用程序中实际使用Unicode是至关重要的.

Bil*_*eal 9

  1. 哪种编码最通用
    可能是UTF-32,尽管所有三种格式都可以存储任何字符.UTF-32具有可以在单个代码点中编码每个字符的属性.

  2. wchar_t
    支持哪种编码.这是实施的定义.在大多数Windows平台上,它是UTF-16,在大多数Unix平台上都是UTF-32.

  3. 其编码由STL支持
    .STL可以存储您想要的任何类型的角色.只需使用std::basic_string<t>类型足够大的模板来保存代码点.大多数操作(例如std::reverse)不知道任何类型的unicode编码.

  4. 这些编码是否全部(或根本没有)以空值终止?
    否.Null是任何编码中的合法值.从技术上讲,NULL也是普通ASCII中的合法字符.NULL终止是一个C事物 - 不是编码事物.

选择如何执行此操作与您的平台有很大关系.如果您使用的是Windows,请使用UTF-16和wchar_t字符串,因为这是Windows API用于支持unicode的内容.我不完全确定UNIX平台的最佳选择是什么,但我知道大多数都使用UTF-8.

  • 你在这里谈的是代码点,而不是字符.无论编码如何,都需要使用多个代码点来描述一些(实际上很多)字符.请查看此链接,例如:http://www.unicode.org/faq/char_combmark.html (3认同)
  • 关于组合字符的好处."一个变音符号o"等于"äo",应该颠倒为"oä".将它颠倒为"o umlaut a"会产生"öa" - 注意变音弹跳. (3认同)
  • 即使使用UTF-32,也无法将每个字符存储为单个代码点.该编码只是确保代码单元和代码点之间的1:1映射(有关术语的详细信息,请查看unicode.org) (2认同)

Mal*_*sen 5

看一下开源库ICU,特别是在Docs&Papers部分.它是一个广泛的图书馆,处理各种unicode奇怪.

  • 这就是为什么我提到他们的文档和论文部分.如果OP真的想要了解unicode处理,他不应该避免看现有的解决方案.ICU不仅提供生产级源代码,还提供设计文档. (2认同)