各种编程语言的 Unicode 支持
-
10-07-2019 - |
题
我希望有一个规范的地方来汇集有关各种语言的 Unicode 支持的信息。它是核心语言的一部分吗?图书馆提供吗?是不是根本不可用?是否有一种语言的 Unicode 信息的流行资源?请每个答案一种语言。另外,如果您可以将该语言设置为标题,则更容易找到。
没有正确的解决方案
其他提示
Python 3k
Python 3k(或3.0或3000)具有处理文本(unicode)和数据的新方法:
文字与数据而不是Unicode Vs. 8位。另请参见 Unicode HOWTO 。
的Java
与.NET相同,Java在内部使用UTF-16: java.lang.String
String
表示UTF-16格式的字符串,其中补充字符由代理项对表示(请参阅Character
类中的Unicode字符表示以获取更多信息) 。索引值是指char
代码单位,因此补充字符在<=>中使用两个位置。
HQ9 +
在大多数实现中,Q命令具有完整的Unicode支持。
的Delphi
Delphi 2009完全支持Unicode。他们已将string
的实现更改为默认为16位Unicode编码,大多数库(包括第三方库)都支持Unicode。请参阅Marco Cant <!>#249;的 Delphi和Unicode 。
在Delphi 2009之前,对Unicode的支持有限,但WideChar
和WideString
存储了16位编码字符串。有关详细信息,请参阅 Delphi中的Unicode 。
注意,您仍然可以在不使用Unicode的情况下开发双语CJKV应用程序。例如,日语的 Shift JIS 编码字符串可以使用普通AnsiString
存储。
的开始强>
Google的 Go编程语言支持Unicode,可与UTF-8配合使用。
Python
Python 2 有这些类 str
和 unicode
. str
对象存储字节, unicode
对象存储 UTF-16 字符。大多数库函数都支持两者(例如 os.listdir('.')
返回一个列表 str
, os.listdir(u'.')
返回一个列表 unicode
对象)。都有 encode
和 decode
方法。
Python 3 基本上已重命名 unicode
到 str
. 。Python 3 相当于 str
将是类型 bytes
. bytes
有一个 decode
和 str
一个 encode
方法。 从Python 3.3开始 str
对象内部使用多种编码之一以节省内存。对于 Python 程序员来说,它看起来仍然像一个抽象的 unicode 序列。
Python 支持:
- 编码/解码
- 正常化
- 简单的大小写转换和空格分割
- 按名字查找角色
Python 不支持/支持有限:
- 整理(有限)
- 小写和大写字符之间没有 1:1 映射的特殊情况转换
- 常用表达 (它已经开始工作了)
- 文本分割
- 双向文本处理
也可以看看: Python 中 Unicode 的真相
的JavaScript
在JS 1.3之前看起来不支持Unicode。从1.5开始,支持UTF-8,UTF-16和UCS-2。您可以在字符串,正则表达式和标识符中使用Unicode转义序列。 来源
.NET(C#、VB.NET...)
.NET 商店 字符串 内部作为一个序列 System.Char
对象。一 System.Char
代表UTF-16 代码单元.
来自 MSDN 文档 System.Char
:
.NET 框架使用 查尔结构代表Unicode字符。Unicode标准将每个Unicode字符识别一个称为代码点的唯一21位标量号码,并定义了UTF-16编码表格,该表格指定了如何将代码点编码为一个或多个16位值的序列。每个16位值的范围从十六进制的0x0000到0xffff,并且存储在一个 查尔 结构。
其他资源:
- .NET 和 C# 中的字符串 (乔恩·斯基特)。
的Tcl
自 Tcl 8.1 (1999年)以来,Tcl字符串一直是Unicode字符序列)。在内部,它们在UTF-8之间动态变形(严格地相同的修改后的UTF-8)由于处理U+00000
字符)和UCS-2(当然是主机字节序和BOM)的Java 。所有外部字符串(有一个例外),包括那些用于与OS通信的字符串,在转换为主机所需的任何编码(或在通信通道上手动配置)之前都是内部Unicode。例外情况是在两个通讯渠道之间复制使用通用编码(以及其他一些没有密切关系的限制),使用直接无副本二进制传输。
BMP以外的字符目前无法在内部或外部处理。这是一个众所周知的问题。
R6RS计划
需要Unicode 5.1的实现。所有字符串都是'unicode格式'。
锈
Rust的字符串(std::String
和&str
)始终是有效的UTF-8,并且不使用空终止符,因此不能将其编入索引,就像它们可以在C / C ++中一样,等等从1.20开始,它们可以像使用.get
一样切片,但需要注意的是,如果你尝试在代码点的中间切片,它将会失败。
Rust还有OsStr
/ OsString
与主机操作系统进行交互。它是Unix上的字节数组(包含任何字节序列)。在Windows上它是WTF-8(UTF-8的超集,它处理Windows和Javascript中允许的不正确形成的Unicode字符串),String
和Path
可以自由转换为PathBuf
或CStr
,但需要检查以反转另一种方式。通过对无效的unicode进行失败,或者使用Unicode替换char进行替换。 (还有CString
/ <=>,它们只是<=> / <=>的包装。)
还有<=>和<=>类型,它们代表Null终止的C字符串,就像在Unix上的<=>一样,它们可以包含任意字节。
Rust不直接支持UTF-16。但是可以在Windows上将<=>转换为UCS-2。
的Objective-C
没有内置的,除了C字符串库中可用的任何内容。
但是,一旦添加了框架<!>#8230;
基金会(Cocoa和Cocoa Touch)和Core Foundation
NSString和CFString各自实现一个完全基于Unicode的字符串类(实际上是几个类,作为实现细节)。这两个是<!>#8220;免费桥接<!>#8221;因此,一个API可以与另一个的实例一起使用,反之亦然。
对于不一定代表文本的数据,有NSData和CFData。 NSString提供方法,CFString提供将文本编码为数据和从数据中解码文本的函数。 Core Foundation支持超过一百种不同的编码,包括所有形式的UTF。编码分为两组:内置编码,随处可见,外部编码,至少在Mac OS X上受支持。
NSString提供了规范化表格D,KD,C或KC的方法。每个都返回一个新字符串。
NSString和CFString都提供了各种各样的比较/整理选项。这是基金会的比较选项标志和 Core Foundation的比较选项标志。它们并非都是同义词;例如,Core Foundation使文字(基于严格的基于代码点)的比较成为默认值,而Foundation使非文字比较(允许带重音的字符比较相等)作为默认值。
请注意,Core Foundation不需要Objective-C;实际上,它的创建几乎是为了提供使用直接C或C ++的Foundation to Carbon程序员的大部分功能。但是,我怀疑它的大多数现代用法都在Cocoa或Cocoa Touch程序中,这些程序都是用Objective-C或Objective-C ++编写的。
C / C ++
C
C99之前的C没有内置的unicode支持。它使用零终止字符数组(char*
或char[]
)作为字符串。 char
由一个字节(8位)指定。
C99指定wcs
- 除旧str
- 函数之外的函数(例如strlen
- <!> gt; wcslen
)。这些函数采用wchar_t*
而不是wchar_t
。 fopen
代表宽字符类型。 std::string
的大小是特定于编译器的,可以小到8位。虽然不同的编译器确实使用不同的大小,但它通常是16位(UTF-16)或32位(UTF-32)。
大多数C库函数对UTF-8都是透明的。例如。如果您的操作系统支持UTF-8(并且UTF-8配置为您的系统字符集),则使用std::wstring
传递UTF-8编码字符串创建文件将创建一个正确命名的文件。
C ++
C ++中的情况非常相似(<=> - <!> gt; <=>),但至少要努力获得某种标准库中的unicode支持。
d
D支持UTF-8,UTF-16和UTF-32(分别为char,wchar和dchar)。可以在此处找到包含所有类型的表格。
PHP
在SO上已有整个主题!
红宝石
我能找到的唯一可以用于Ruby的东西已经很老了,而且不是很麻烦,我不确定它有多精确。
为了记录,Ruby确实支持utf8,但不支持多字节。在内部,它通常假定字符串是字节向量,尽管通常可以使用库和技巧来使事情有效。
发现此处
Ruby 1.9
Ruby 1.9将编码附加到字符串。二进制字符串使用编码<!>“ASCII-8BIT <!>”;虽然在任何现代系统上默认编码通常都是UTF-8,但您不能假设所有第三方库函数始终返回此编码中的字符串。它可能返回任何其他编码(例如,某些yaml解析器在某些情况下会这样做)。如果连接两个不同编码的字符串,可能获得Encoding::CompatibilityError
。
的Lua
Lua 5.3有一个内置的utf8
库,它处理UTF-8编码。它允许您将一系列代码点转换为相应的字节序列,反之亦然,获取长度(字符串中的代码点数),迭代字符串中的代码点,获取的字节位置n 代码点。它还提供了一个模式,供string
库中的模式匹配函数使用,它将匹配一个UTF-8字节序列。
Lua 5.3具有Unicode代码点转义序列,可用于字符串文字(例如,"\u{61}"
for "a"
)。它们转换为UTF-8字节序列。
Lua源代码可以用UTF-8编码,也可以用ASCII字符占用一个字节的任何编码。 vanilla Lua解释器不理解UTF-16和UTF-32。但字符串可以包含任何编码或任意二进制数据。