哪些编程语言从一开始就支持Unicode?

19

哪些广泛使用的编程语言最初就是以支持Unicode为基础设计的?

许多编程语言后来才在版本更新中加入了对Unicode的支持,但哪些广泛使用的语言从一开始就支持Unicode呢?


8
当然,许多最受欢迎和成功的编程语言是在Unicode引入之前就存在了。 - Ned Deily
4
除了 Python 3,大多数编程语言都不支持 Unicode 的 16 位之上的扩展。Java 和 .NET 语言都支持 UCS2,并在后来加入了处理代理项的方法。 - Pete Kirkham
好奇,你为什么问? - Roman
你说的是哪个版本的Unicode?许多语言都是在Unicode 1.0支持下设计的,但很少有语言从一开始就支持Unicode 4.0。你对哪些具体的Unicode特性感兴趣? - Daniel Pryden
2
罗曼:纯粹的语言历史兴趣。 - knorv
如果Haskell考虑到Unicode和多语言,它的语法是否可以定义得不同?我很感兴趣地从一个聪明的答案中了解到(https://dev59.com/51XTa4cB1Zd3GeqP5M5U#5517639),尽管Haskell允许使用Unicode标识符,但如果该语言是单例写作的(在其中没有区分大小写的Unicode),那么在Haskell中用您最喜欢的人类语言编程所有标识符将会成为一个问题,因为Haskell假定您对不同目的使用不同大小写的标识符! - imz -- Ivan Zakharyaschev
12个回答

33

Java 可能是第一种从底层开始支持 Unicode 的流行编程语言。


5
除了它“只”支持基本多语言平面(当Java被发明时,这就是Unicode所拥有的全部)之外,.NET框架是我所知道的第一个围绕“完整”的Unicode支持设计的语言(包括包含代理项的字符串的正确长度...)。 - mihi
7
Java一直支持完整的Unicode标准,而不仅仅是BMP。字符串以UTF-16存储(而不是UCS-2,后者只支持BMP)。 - Joachim Sauer
6
在设计Java时,Unicode仅限于BMP。根据.NET中String的MSDN文档 -“ Length属性返回此实例中Char对象的数量,而不是Unicode字符的数量。” java.lang.String.codePointCount()方法返回字符串中代码点的数量,考虑了代理项。 - Pete Kirkham
1
@ Joachim Sauer:UCS-2支持完整的Unicode标准(不要忘记代理对D800到DBFF)。Java和.NET框架都设计为使用UTF-16,但Java是在UTF-32 / UCS-4之前设计的,而.NET是在之后设计的,但两种语言都可以访问完整的代码点范围。 - Martin York
2
@JoachimSauer: 然而,仍然没有内置功能可以迭代String的字符 - Mechanical snail

31

基本上,所有的.NET语言都是Unicode语言,比如C#VB.NET


1
真的吗?向微软击掌!不知道IronRuby、IronPython和F#是否也是一样的情况? - George Mauer
7
George,所有使用System.String类的.NET语言都有完整的Unicode支持。我不知道任何不使用System.String类的.NET语言,这意味着IronRuby、IronPython和尤其是F#(自VS2010起成为一流语言)具有本地Unicode支持。当已经在BCL中提供了Unicode字符串类时,我想不出有什么好理由创建一个特殊的非Unicode字符串类的.NET语言。 - Allon Guralnek
1
严格来讲,System.String 由 UTF-16 编码字符组成,而不是 Unicode 5 抽象码位(字形)。如果你的应用程序关心这一点(大多数情况下不需要),那么可以使用 System.Globalization.StringInfo 类。 - Christian Hayter
1
你能否制作一个符合CLS标准的语言,但不支持System.String吗? - Chris S

20
在Python 3中有许多重大变化,其中之一是将所有文本转换为Unicode。因此Python不是从头开始为Unicode设计的,但是Python 3是为Unicode而设计的。

Python 在 2000 年加入了 Unicode 支持。虽然不是完全“从头开始”,但它算得上是相当早的。http://www.python.org/dev/peps/pep-0100/(编辑:实际上,该文档在 2000 年成为 PEP,Unicode 支持可能比此更早)。 - fuzzyman
1
我对这个答案获得的点赞数感到惊讶。Python 3只是一个重大的发布版本,而不是一种新的编程语言。 - yeyo

12

我不知道其他语言是否也有类似的特性,但是C#的一个有趣之处在于,不仅运行时(例如string类)能够处理Unicode——源代码也可以完全支持Unicode:

using משליט = System.Object;
using תוצאה = System.Int32;
public class שלום : משליט  {
    public תוצאה בית() {
        int אלף = 0;
        for (int λ = 0; λ < 20; λ++) אלף+=λ;
        return אלף;
    }
}

2
(请注意,浏览器/编辑器中可能存在一些奇怪的从右到左的问题;如果您将其粘贴到VS中,则为“int {name} = 0”) - Marc Gravell
2
尝试在LINQPad中运行"πθ√".Select(c=>CharUnicodeInfo.GetUnicodeCategory(c)),你就会明白为什么了;-) - Eamon Nerbonne
4
Perl 5和Perl 6相同。Perl 6甚至具有Unicode运算符。 - Alexandr Ciornii
Python长期以来已经支持源代码文件的显式编码。只有在Python 3中才能使用Unicode标识符。Unicode运算符是一个可怕的想法... - fuzzyman

10

7
设计一种支持Unicode的编程语言,确实很难。Java是其中之一,它将这一特性设计成了语言规范的一部分。然而,Java v1.0的Unicode支持与Java SDK的v5和v6的Unicode支持不同。这主要是因为当最初设计该语言时,语言规范适用的Unicode版本不同。Java试图在每个重大发布版本中跟踪Unicode标准的变化。
JLS的早期实现可以声称支持Unicode,主要是因为Unicode本身支持65536个字符(Java v1.0支持Unicode 1.1,Java v1.4支持Unicode 3.0),这与字符占用的16位存储空间兼容。随着Unicode 3.1的推出,情况发生了变化 - 它是一个不断发展的标准,通常每个版本都会添加更多的字符。在3.1后期添加的字符被称为补充字符。通过JSR-204,Java 5增加了对补充字符的支持;Java 5和6支持Unicode 4.0。
因此,如果不同的编程语言以不同的方式实现Unicode支持,也不要感到惊讶。
另一方面,在PHP和Ruby的初始设计中没有内置Unicode支持。
PS:对于Unicode v5.1的支持将在Java 7中实现。

5
Java和.NET语言,正如其他评论者所指出的那样,虽然Java的字符串是UTF-16而不是UCS或UTF-8。(当时,这似乎是一个明智的想法!现在显然UTF-8或UCS会更好。) Python 3实际上是与Python 1.x和2.x不兼容的不同语言,因此它也符合条件。
Plan9语言大约在1992年左右可能是第一个这样做的:他们的C方言rc、Alef、mk、ACID等都支持Unicode。他们采取了非常简单的方法,即任何不是ASCII的字符都是标识符字符。请参见他们关于该主题的论文(链接1)。(这是UTF-8发明的项目,这意味着他们可以以相当兼容的方式进行操作,特别是无需通过所有程序来传递二进制与文本之间的区别。)
支持非ASCII标识符的其他语言包括当前的PHP。

4

Perl 6完全支持Unicode,从头开始。
Rakudo Perl 6编译器是第一个实现的编译器)

总体概述

Unicode运算符

字符串、正则表达式和语法都基于字形操作,即使对于那些没有组合表示的码点组合,也会为其生成人工码点的组合表示。

存在一种特殊的编码来处理未知编码的数据“utf8-c8”:这假定使用utf-8,但对于无法编码的序列创建人工码点,允许它们在必要时进行往返转换。


2

1

有时候,一门语言在最初设计时包含的功能并不总是最好的。

随着时间的推移,许多语言变得臃肿,添加了额外的功能,但并没有必要保持最初包含的功能的更新。

因此,我认为你不应该轻视那些最近添加Unicode的语言。它们将具有将Unicode添加到已经成熟的开发工具中的优势,并有机会第一次就做到正确。

考虑到这一点,我想确保Delphi作为你的答案之一。Embarcadero在他们的Delphi 2009版本中添加了Unicode,并且做得非常出色。这足以最终促使我从我使用了10年的Delphi 4升级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接