【问题标题】:Are there any real alternatives to unicode?有没有真正的unicode替代品?
【发布时间】:2018-02-07 08:42:45
【问题描述】:

作为支持 unicode 的 C++ 开发人员,委婉地说,是一件很头疼的事。 Unicode 有一些不幸的属性,使得很难确定字母的大小写、转换它们或几乎任何东西,除了识别单个已知的代码点左右(可能是也可能不是字母)。对于那些不幸没有内置语言(即 C 和 C++)的 unicode 支持的人来说,唯一真正的拯救似乎是 ICU。对其他语言的 unicode 的支持可能不够好,也可能不够好。

所以,我想,必须有一个 真正的 替代 unicode!即,除了具有查找数据结构(树、表等)以及识别字符之间的关系之外,还允许轻松识别字符类的编码?我怀疑对于大多数文本来说,任何这样的编码都可能是多字节的——这对我来说并不是一个真正的问题,但我接受它是给其他人的。提供这样的编码需要做很多工作,所以我真的不希望存在任何这样的编码????。

【问题讨论】:

  • 我不确定我理解什么是痛苦;它是特定于 C++ 的东西吗? Unicode 为每个字符定义了一个属性类别,告诉您它是否是字母,是大写还是小写或根本不区分大小写等等。它还提供了定义大写/小写相关性等的表格。一定要找到它访问这些信息很麻烦,或者它是否困扰您甚至存在不加大小写的字母之类的东西?
  • 我什至没有考虑过不加壳的字母。令我困扰的是,我无法查看字符(一串字节)而只查看几位并知道它与另一个字节串共享的类集,而没有大量数据。我明确地必须检查每个类的两个字符。 ASCII 可能是这个问题的主要原因。 i 例如;根据语言环境,它可以转换为各种大写字符,而不仅仅是I
  • 你混合了两件事。 i 的大写版本依赖于语言环境的问题与 Unicode 或 ASCII 无关——你不得不责怪 Kemal Atatürk 在一百年前发明了İ
  • 我同意能够在没有表格的情况下从数字代码点中分辨出类别会很好。但是以可扩展的方式设计这样的编码会很棘手 - 正如您可能知道的那样,每年都会向 Unicode 添加新字符。
  • 无论如何,我认为没有任何方法可以将一个字符普遍映射到另一种情况,因为每种语言都有自己的方法来映射字符大小写,就像您已经看到的 i 示例一样。此外,Unicode 在每个代码点like this 中有很多标志,并且不可能以紧凑的方式存储它们。 Case mapping on Unicode is hard

标签: unicode


【解决方案1】:

简短的回答:我不知道。

作为一个非 C++ 开发者,我不知道 Unicode 到底有什么痛点,但既然你没有用 C++ 标记问题,我还是敢尝试回答。

虽然我个人对 Unicode 总体上非常满意,但我同意某些方面很麻烦。 如果从头开始重新设计 Unicode,其中一些可以说可以得到改进,例如。除了实际的希腊字母之外,还删除了一些冗余,例如“拉丁希腊语”数学字母(但这也会破坏与旧编码的兼容性)。

但大多数“痛苦”只是首先反映了写作的混乱用法。 您提到自己的大写“i”问题,在某些拼写法中是“I”,在其他拼写法中是“İ”,但还有很多其他困难——例如。德语“ß”,它是小写的,但没有大写等效项(嗯,现在有,但很少使用);或在最终位置看起来不同的字母(希腊语“σ”/“ς”);或反义词(«法式风格»与»瑞士风格«、“英式”与“德式”)……我可以继续说一会儿。

除了提供字符属性、等价和关系表之外,我看不出编码对这有什么帮助,而这正是 Unicode 所做的。 您在 cmets 中说,通过查看编码字符的字节,您希望它告诉您它是大写还是小写。 对我来说,这听起来像是在说:“当我看到一个数字时,我希望它告诉我它是否是素数。” 我的意思是,即使是 ASCII 码也不能告诉你它们是大写还是小写,你只是记住了属性表,它告诉你 41..5A 是大写,61..7A 是小写。 但是对于所有 120k Unicode 代码点,很难记住或硬编码这些范围。所以最简单的方法就是使用表格查找。

对于“编码”的含义也有些混淆。 Unicode 没有定义任何字节表示,它只分配代码点,即。整数,字符定义,并维护所述表。 严格意义上的编码(“编解码器”)是转换格式(UTF-8 等),它定义了代码点与其字节表示之间的映射。 现在可以定义一个新的 UTF,它将代码点映射到字节,从而为大写/小写提供模式。 但那会是什么? 大写奇数,甚至小写? 但是没有大小写区分的字母呢? 然后,不是字母的字符? 那么所有其他字符类别——标点符号、数字、空格、符号、组合变音符号——呢?为什么不把它们也表示出来呢? 您可以将每个字符都放在预定义的范围内,但是如果将太多新字符添加到某个类别中会发生什么?

总结一下:我不认为你所要求的是可能的。

【讨论】:

  • 字母没有大小写,只有小写或只有大写并不是真正的问题——只要你能在不区分大小写的情况下识别出一个字母等同于另一个字母考虑到这很好。真正的问题似乎是某些文化定义了如何在不同案例之间转换的规则。 IE。 ê 在某些语言中与 E 比较,但在其他语言中不等于 E。 非常很容易判断 ASCII 字符是大写还是小写。 ß 确实有一个等效的大写字母。 fileformat.info/info/unicode/char/1e9e/index.htm
  • 图形表示在搜索上下文中并不重要。
  • 你不断提出新的东西——谁说过图形表示?您现在谈论整理(字符之间的等价性),这当然是一个麻烦的话题,但是新的编码在这里有什么帮助呢?你自己给出例子——它们都反映了不一致的词典规则。当然,如果其他人弄错了 Unicode,那会很痛苦,但是,说真的,另一种编码会有什么帮助呢?
  • 您提出了图形表示。我指出这无关紧要。如果图形表示因上下文而发生变化,则与确定它属于哪些字母类别无关。
  • 我想我没有,但也许我们谈论的不是同一个东西。我可能正在考虑字形的选择,这个话题在这里肯定是无关紧要的,我没有触及(sigma 示例与字形无关:σ 和 ς 是不同的代码点,但它们具有相同的大写对应)。
猜你喜欢
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多