是否存在具有完全和正确的Unicode支持的编程语言?

问题描述 投票:8回答:8

[大多数编程语言都对Unicode提供some支持,但是所有语言都有或多或少有记载的特殊情况,在这种情况下,事情将无法正常工作。


示例

Java:StringBuilder / StringBuffer中的reverse()正常工作。但是,如果字符需要超过16位的编码,则String中的length(),charAt()等不需要。

C#:找不到正确的反向方法,长度和索引访问返回错误结果。

Perl:相同的问题。

PHP:根本没有Unicode的概念,mbstring有一些更好的替代品。


我想知道是否有一种编程语言,该语言具有完全和正确的Unicode支持?要实现这样的目标,必须做出什么妥协?

  • 更复杂的算法?
  • 更高的内存消耗?
  • 性能较慢?

它是如何在内部实现的?

  • 整数数组,链接列表等
  • 附加缓冲

我看到Python 3在这方面有一些很大的变化。 Python 3现在距离正确的实现有多近?

string language-agnostic unicode programming-languages encoding
8个回答
9
投票

Java实现在不违反Unicode标准的意义上是正确的;没有规定字符串索引在代码点而不是代码单元上起作用,并且行为已记录在案。只要没有泄漏无效字符串,Unicode标准就为实现者提供了极大的优化自由。关于“全面支持”,这甚至很难定义。 Unicode标准通常不需要将某些功能实现为与Unicode兼容;仅实现的功能是根据标准实现的。与脚本处理有关的大量部分属于字体或操作系统,编程系统无法控制这些字体或操作系统。如果要判断某些技术对Unicode的支持,可以先测试以下(主观和非详尽的)主题列表:

  • 系统是否具有使用Unicode编码的字符串数据类型?
  • 标准中是否支持所有Unicode(UTF)编码?
  • 规范化
  • 双向算法
  • UpperCase("ß") = "SS"
  • 大写字母的语言环境敏感吗? (例如,土耳其语UpperCase("i") = "İ"
  • 是否有使用代码点而非代码单元的功能?
  • Unicode正则表达式
  • 在解码过程中遇到无效的代码单元序列时,系统会引发异常吗?
  • 访问Unicode数据库属性?

我认为这些问题的Java和.NET答案大多是“是”,而Python 3.x答案几乎总是“否”。


7
投票

Go,由Ken ThompsonRob Pike发明的Google开发的新语言以及C dialectPlan9中的Bell Labs是在考虑Unicode的基础上构建的[UTF-8是在贝尔发明的实验室,肯·汤普森(Ken Thompson)。


5
投票

在Python 3中,字符串始终是unicode(ASCII或类似编码为bytes)。我不知道有任何内置插件无法正常使用。可能有一些,但考虑到已经有一段时间了,我认为他们已经掌握了日常工作所需的一切。

当然,Unicode具有更高的内存消耗(如果保持在ASCII范围内,则不是真正的UTF-8,而是...),我可以想象到多长度编码在内部很难处理。不过,我对实现一无所知。因为它具有O(1)随机访问权限,但是它不能是链接列表。


5
投票

看来Perl 6获得了良好的Unicode支持:

perlgeek.de/en/article/5-to-6#post_17

例如,它为您提供了三种不同的长度方法:

  • 字节(字节数)
  • 代码(代码点数量)
  • 图(字素数量)

这也被集成到Perl的正则表达式中。

看起来像是向我迈出了正确的一步。


1
投票

。NET Framework使用UTF-16编码存储charstring数据。如果您假定所有文本都位于“基本多语言平面”内,那么一切都将正常工作而无需任何特殊代码。

如果您将用户输入的字符串视为Blob,并且不尝试对其进行操作(例如CRUD应用程序中的大多数文本字段),那么您的代码将appear正确处理BMP之外的字符,因为UTF-16将它们存储为代理对。只要您不摆弄代理对,一切都会很好。

但是,如果您要分析和处理字符串,同时还要正确处理BMP之外的字符,则必须为这种可能性明确编码。有关帮助您处理代理对的方法,请参见StringInfo类。

我想微软会以此方式设计,以在性能和正确性之间取得平衡。替代方法是:

  • 将字符串存储为UTF-32-在内存使用方面性能较差
  • 使所有字符串函数处理代理对-非常处理性能差

。NET还包含对文化意识的案例转换,比较和排序的完全支持。


0
投票

我相信.NET framework支持的任何语言都具有正确的Unicode(UTF-16)支持。

也类似的问题here


0
投票

DigitalMars D具有使用UTF32代码点的数据类型dstring,对于大多数情况应该足够了。


0
投票

认为这是10年前的问题,...

是。斯威夫特呢。

  • 基本字符串类型String在Unicode“字形群集”级别执行所有字符处理。因此,您必须在“人类感知的字符”级别以“ Unicode正确”的方式执行每个文本更改操作。

  • String类型是抽象的数据类型,不公开其内部表示形式,但是具有用于访问所有UTF-8,UTF-16,UTF-32编码的Unicode标量值和Unicode代码单元的接口。

  • [[它还存储面包屑,以在摊销的O(1)时间中提供UTF-8和UTF-16之间的偏移量转换。
  • [Character类型还提供分解成Unicode标量值。
  • Character类型具有多种基于Unicode语义的字符分类方法。例如,Character.isNewline对于Unicode标准中定义的所有换行字符串,包括LF,VT,FF,CR,CR-LF,NEL等,返回Character.isNewline
  • 尽管它是抽象的,但是默认情况下,Swift 5.x在内部以UTF-8编码形式存储字符串。
© www.soinside.com 2019 - 2024. All rights reserved.