各种编程语言中的Unicode支持

时间:2009-06-24 05:49:31

标签: unicode programming-languages

我希望有一个规范的地方可以汇集各种语言的Unicode支持信息。它是核心语言的一部分吗?它是在图书馆提供的吗?它根本不可用吗?是否有一种资源流行的语言中的Unicode信息资源?请回答一种语言。此外,如果您可以使语言成为更容易找到的标题。

20 个答案:

答案 0 :(得分:11)

的Perl

Perl主要内置Unicode支持。有点。来自perldoc:

  • perlunitut - 在Perl中使用Unicode的教程。在绝对意义上教授你应该和不应该做什么到Unicode。涵盖基础知识。
  • perlunifaq - 关于Perl中Unicode的常见问题。
  • perluniintro - Perl中的Unicode简介。比perlunitut更少“说教”。
  • perlunicode - 当你必须知道有关Unicode和Perl的所有知识的时候。

答案 1 :(得分:8)

Python 3k

Python 3k(或3.0或3000)具有处理文本(unicode)和数据的新方法:
Text Vs. Data Instead Of Unicode Vs. 8-bit。另请参阅Unicode HOWTO

答案 2 :(得分:7)

HQ9 +

在大多数实现中,Q命令具有完整的Unicode支持。

答案 3 :(得分:7)

的Java

与.NET相同,Java在内部使用UTF-16:java.lang.String

  

String表示UTF-16格式的字符串,其中补充字符代理项对表示(请参阅Unicode Character Representations部分在Character课程中获取更多信息。索引值是指char个代码单位,因此补充字符使用String中的两个位置。

答案 4 :(得分:4)

开始

Google的Go programming language支持Unicode,可与UTF-8配合使用。

答案 5 :(得分:4)

的Delphi

Delphi 2009完全支持Unicode。他们已将string的实现更改为默认为16位Unicode编码,大多数库(包括第三方库)都支持Unicode。见MarcoCantù的Delphi and Unicode

在Delphi 2009之前,对Unicode的支持有限,但有WideCharWideString来存储16位编码字符串。有关详细信息,请参阅Unicode in Delphi

注意,您仍然可以在不使用Unicode的情况下开发双语CJKV应用程序。例如,日语的Shift JIS编码字符串可以使用普通AnsiString存储。

答案 6 :(得分:4)

的Python

Python 2包含类strunicodestr个对象存储字节,unicode个对象存储UTF-16字符。大多数库函数都支持两者(例如os.listdir('.')返回str列表,os.listdir(u'.')返回unicode个对象列表。两者都有encodedecode方法。

Python 3基本上将unicode重命名为str。相当于str的Python 3将是bytes类型。 bytesdecodestr encode方法。 Since Python 3.3 str个对象在内部使用多种编码之一以节省内存。对于Python程序员来说,它仍然看起来像一个抽象的unicode序列。

Python支持:

  • 编码/解码
  • 归一化
  • 简单的大小写转换和空格分割
  • 按姓名查找字符

Python不支持/对以下内容的支持有限:

  • 整理(限定)
  • 特殊情况转换,其中大小写字符之间没有1:1映射
  • 正则表达式(it's worked on
  • 文字细分
  • 双向文字处理

另请参阅:The Truth about Unicode in Python

答案 7 :(得分:3)

.NET(C#,VB.NET,...)

.NET在内部将strings存储为一系列System.Char个对象。一个System.Char代表UTF-16 code unit

来自System.Char上的MSDN文档:

  

.NET Framework使用 Char   结构来表示Unicode   字符。 Unicode标准   使用标识每个Unicode字符   一个独特的21位标量数,称为a   代码点,并定义UTF-16   编码形式,指定如何   代码点被编码成一个序列   一个或多个16位值。每   16位值的范围是十六进制   0x0000到0xFFFF并存储在    Char 结构。

其他资源:

答案 8 :(得分:3)

R6RS计划

需要Unicode 5.1的实现。所有字符串都是'unicode格式'。

答案 9 :(得分:3)

的Tcl

Tcl 8.1(1999)以来,Tcl字符串一直是Unicode字符序列。在内部,它们在UTF-8之间动态变换(由于处理U+00000字符而严格the same Modified UTF-8 as Java)和UCS-2(当然,在主机字节序和BOM中)。所有外部字符串(有一个例外),包括那些用于与OS通信的字符串,在转换为主机所需的任何编码(或在通信通道上手动配置)之前都是内部Unicode。例外情况是数据为copied between two communications channels,其中使用了通用编码(以及其他一些与其密切相关的限制),其中使用了直接无副本二进制传输。

BMP以外的字符目前无法在内部或外部处理。这是一个众所周知的问题。

答案 10 :(得分:3)

的JavaScript

在JS 1.3之前看起来不支持Unicode。从1.5开始,支持UTF-8,UTF-16和UCS-2。您可以在字符串,正则表达式和标识符中使用Unicode转义序列。 Source

答案 11 :(得分:3)

Rust的字符串(std::String&str)始终是有效的UTF-8,并且不使用空终止符,因此不能将其编入索引作为数组,就像它们可以在C中一样/ C ++等。从1.20开始,它们可以像使用.get一样切片,但需要注意的是,如果尝试切片代码点的中间部分,它将会失败。

Rust还有OsStr / OsString用于与主机操作系统交互。它是Unix上的字节数组(包含任何字节序列)。在Windows上它是WTF-8(UTF-8的超集,它处理Windows和Javascript中允许的不正确形成的Unicode字符串),&strString可以自由转换为{{1 }或OsStr,但要求检查以另一种方式转换。通过对无效的unicode进行失败,或者使用Unicode替换char进行替换。 (还有OsString / Path,它们只是PathBuf / OsStr的包装。

还有OsStringCStr类型,表示Null终止的C字符串,如Unix上的CString,它们可以包含任意字节。

Rust不直接支持UTF-16。但是可以在Windows上将OsStr转换为UCS-2。

答案 12 :(得分:2)

d

D支持UTF-8,UTF-16和UTF-32(分别为char,wchar和dchar)。可以找到包含所有类型的表格here

答案 13 :(得分:2)

的Objective-C

没有内置的,除了C字符串库中可用的任何内容。

但是,一旦添加了框架......

基金会(Cocoa和Cocoa Touch)和Core Foundation

NSString和CFString各自实现一个完全基于Unicode的字符串类(实际上是几个类,作为实现细节)。这两个是“免费桥接”,因此一个API可以与另一个的实例一起使用,反之亦然。

对于不一定代表文本的数据,有NSData和CFData。 NSString提供方法,CFString提供将文本编码为数据和从数据中解码文本的函数。 Core Foundation支持超过一百种不同的编码,包括所有形式的UTF。编码分为两组:built-in encodings,在任何地方都受支持,external encodings,至少在Mac OS X上受支持。

NSString提供了规范化表格D,KD,C或KC的方法。每个都返回一个新字符串。

NSString和CFString都提供了各种各样的比较/整理选项。以下是Foundation's comparison-option flagsCore Foundation's comparison-option flags。它们并非都是同义词;例如,Core Foundation使文字(基于严格的基于代码点)的比较成为默认值,而Foundation使非文字比较(允许带重音的字符比较相等)作为默认值。

请注意,Core Foundation不需要Objective-C;实际上,它的创建几乎是为了提供使用直接C或C ++的Foundation to Carbon程序员的大部分功能。但是,我怀疑它的大多数现代用法都在Cocoa或Cocoa Touch程序中,这些程序都是用Objective-C或Objective-C ++编写的。

答案 14 :(得分:2)

Common Lisp(SBCL和CLisp)

根据thisSBCLCLisp支持Unicode。

答案 15 :(得分:2)

C / C ++

C

C99之前的C没有内置的unicode支持。它使用零终止字符数组(char*char[])作为字符串。 char由一个字节(8位)指定。

C99指定wcs - 除旧str - 函数之外的函数(例如strlen - > wcslen)。这些函数采用wchar_t*代替char*wchar_t代表宽字符类型。 wchar_t的大小是特定于编译器的,可以小到8位。虽然不同的编译器确实使用不同的大小,但它通常是16位(UTF-16)或32位(UTF-32)。

大多数C库函数对UTF-8都是透明的。例如。如果您的操作系统支持UTF-8(并且UTF-8配置为您的系统字符集),那么使用fopen创建一个传递UTF-8编码字符串的文件将创建一个正确命名的文件。

C ++

C ++中的情况非常相似(std::string - > std::wstring),但至少要努力获得某种unicode support in the standard library

答案 16 :(得分:1)

PHP

SO上已经有entire thread了!

答案 17 :(得分:1)

红宝石

我能找到的唯一可以用于Ruby的东西已经很老了,而且不是很麻烦,我不确定它有多精确。

  

为了记录,Ruby确实支持utf8,但不支持多字节。在内部,它通常假定字符串是字节向量,尽管通常可以使用库和技巧来使事情有效。

找到here

Ruby 1.9

Ruby 1.9将编码附加到字符串。二进制字符串使用编码“ASCII-8BIT”。虽然在任何现代系统上默认编码通常都是UTF-8,但您不能假设所有第三方库函数始终返回此编码中的字符串。它可能返回任何其他编码(例如,某些yaml解析器在某些情况下会这样做)。如果您连接两个不同编码的字符串,则可能获得Encoding::CompatibilityError

答案 18 :(得分:0)

Arc

Arc没有任何unicode支持。 Yet

答案 19 :(得分:0)

的Lua

Lua 5.3有一个内置的utf8库,它处理UTF-8编码。它允许您将一系列代码点转换为相应的字节序列,反之亦然,获取长度(字符串中的代码点数),迭代字符串中的代码点,获取的字节位置n 代码点。它还提供了一个模式,供string库中的模式匹配函数使用,它将匹配一个UTF-8字节序列。

Lua 5.3具有Unicode代码点转义序列,可用于字符串文字(例如,"\u{61}"用于"a")。它们转换为UTF-8字节序列。

Lua源代码可以用UTF-8编码,也可以用ASCII字符占用一个字节的任何编码。 vanilla Lua解释器不理解UTF-16和UTF-32。但字符串可以包含任何编码或任意二进制数据。