代码之家  ›  专栏  ›  技术社区  ›  Craig

各种编程语言中的Unicode支持

  •  28
  • Craig  · 技术社区  · 5 年前

    我想有一个规范的地方来汇集各种语言中关于Unicode支持的信息。它是核心语言的一部分吗?图书馆里有吗?根本就没有吗?在一种语言中,是否有一种流行的Unicode信息资源?请给每个答案一种语言。如果你能让语言成为一个更容易找到的标题。

    20 回复  |  直到 15 年前
        1
  •  11
  •   Chris Lutz    15 年前

    Perl语言

    Perl基本上内置了Unicode支持。某种程度上。来自perldoc:

    • perlunitut -Perl中使用Unicode的教程。主要是以绝对的方式教你应该做什么,不应该做Unicode。包括基础知识。
    • perlunifaq -Perl中有关Unicode的常见问题解答。
    • perluniintro -Perl中的Unicode简介。“说教”不如 佩鲁尼特 .
    • perlunicode -因为当你必须完全了解Unicode和Perl时。
        2
  •  8
  •   Marc Bollinger    13 年前

    蟒蛇3k

    Python3K(或3.0或3000)提供了处理文本(unicode)和数据的新方法:
    Text Vs. Data Instead Of Unicode Vs. 8-bit . 另见 Unicode HOWTO .

        3
  •  7
  •   Joey    15 年前

    爪哇

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

    一个 String 表示UTF-16格式的字符串,其中 补充字符 代理对 (见章节 Unicode Character Representations Character 类获取更多信息)。索引值参考 char 代码单位,因此一个补充字符在 字符串 .

        4
  •  7
  •   user142019    13 年前

    HQ9型+

    Q命令在大多数实现中都完全支持Unicode。

        5
  •  4
  •   Cameron MacFarland    15 年前

    德尔菲

    Delphi2009完全支持Unicode。他们改变了 string 默认为16位Unicode编码,并且大多数库(包括第三方库)都支持Unicode。见马可·坎特 Delphi and Unicode .

    在Delphi2009之前,对Unicode的支持是有限的,但是 WideChar WideString 存储16位编码字符串。见 Unicode in Delphi 更多信息。

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

        6
  •  4
  •   Rohit    14 年前

    去吧

    谷歌的 Go programming language 支持Unicode并与UTF-8一起使用。

        7
  •  4
  •   panzi    11 年前

    蟒蛇

    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 . 字节 有一个 解码 str公司 一个 编码 方法。 Since Python 3.3 str公司 对象在内部使用多个编码之一以节省内存。对于Python程序员来说,它仍然像一个抽象的unicode序列。

    Python支持:

    • 编码/解码
    • 标准化
    • 空格上的简单大小写转换和拆分
    • 按名称查找字符

    Python不支持/有限支持:

    • 校勘(有限)
    • 小写和大写字符之间没有1:1映射的特殊大小写转换
    • 正则表达式( it's worked on )
    • 文本分割
    • 双向文本处理

    另见: The Truth about Unicode in Python

        8
  •  3
  •   baudtack    15 年前

    JavaScript

    看起来在JS 1.3之前没有对Unicode的支持。从1.5开始,都支持UTF-8、UTF-16和UCS-2。可以在字符串、regex和标识符中使用Unicode转义序列。 Source

        9
  •  3
  •   Fredrik Mörk    14 年前

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

    .NET存储 strings 在内部作为 System.Char 物体。一个 字符串属性 表示UTF-16 code unit .

    从上的MSDN文档 字符串属性 :

    .NET框架使用 烧焦 表示Unicode的结构 性格。Unicode标准 用 一个唯一的21位标量,称为 代码点,并定义UTF-16 编码表单,指定 编码点被编码成一个序列 一个或多个16位值。每个 16位值范围从十六进制 0x0000到0xFFFF并存储在 一 烧焦 结构。

    其他资源:

        10
  •  3
  •   Donal Fellows    14 年前

    Tcl公司

    Tcl字符串自 Tcl 8.1 (1999年)。在内部,它们在UTF-8(严格地说 the same Modified UTF-8 as Java 由于处理 U+00000 字符)和UCS-2(当然是在主机端和BOM中)。所有外部字符串(只有一个例外),包括用于与操作系统通信的字符串,在转换为主机所需的任何编码(或在通信通道上手动配置)之前,都是内部Unicode。例外情况是数据所在的位置 copied between two communications channels 在使用直接无拷贝二进制传输的情况下,使用通用编码(以及一些其他限制条件,此处不存在密切关系)。

    BMP之外的字符当前不在内部或外部处理。这是一个众所周知的问题。

        11
  •  3
  •   leppie    14 年前

    R6RS方案

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

        12
  •  3
  •   Tristram Healy    6 年前

    生锈

    铁锈线( std::String &str 总是有效的UTF-8,并且不使用null终止符,因此不能作为数组索引,就像它们可以在C/C++中一样。 .get 从1.20开始,需要注意的是,如果您尝试分割代码点的中间部分,它将失败。

    锈也有 OsStr / OsString 用于与主机操作系统交互。它是Unix上的字节数组(包含任何字节序列)。在windows上,它是WTF-8(处理windows和Javascript中允许的格式不正确的Unicode字符串的UTF-8的超级集合), &str公司 String 可以自由转换为 骨质疏松 骨串 ,但需要检查才能以其他方式隐藏。要么对无效的unicode失败,要么替换为unicode替换字符。(还有 Path / PathBuf ,只是包装纸 骨质疏松 / 骨串 ).

    还有 CStr CString 类型,表示以空结尾的C字符串,如 骨质疏松 在Unix上,它们可以包含任意字节。

    铁锈不能直接支持UTF-16。但是可以转换 骨质疏松 到windows上的UCS-2。

        13
  •  2
  •   baudtack    15 年前

    通用Lisp(SBCL和CLisp)

    根据 this , SBCL CLisp 支持Unicode。

        14
  •  2
  •   Peter Hosey    14 年前

    目标C

    没有内置的,除了作为C字符串库的一部分的任何内容。

    但是,一旦您添加了框架

    粉底(可可和可可触感)和核心粉底

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

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

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

    NSString和CFString都提供了多种比较/排序选项。这是 Foundation's comparison-option flags Core Foundation's comparison-option flags . 它们并不都是同义词;例如,Core Foundation将literal(严格的基于代码点的)比较设为默认值,而Foundation将非literal比较(允许带有重音符号的字符比较相等)设为默认值。

    请注意,核心基础不需要Objto-C;事实上,它创建了很多,以提供基本特征的碳程序员,谁使用直C或C++。然而,我怀疑它最现代的用法是可可或可可触摸程序,所有这些都是用Objtovi-C或Objul-C++编写的。

        15
  •  2
  •   panzi    11 年前

    C/C++

    C类

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

    C99规定 wcs -旧功能之外的功能 str -功能(例如。 strlen -> wcslen ). 这些功能 wchar_t* 而不是 字符* . wchar_t 代表宽字符类型。大小 乌恰 是编译器特定的,可以小到8位。虽然不同的编译器使用不同的大小,但通常是16位(UTF-16)或32位(UTF-32)。

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

    C++

    C++中的情况非常相似。 std::string -> std::wstring ),但至少有一些努力 unicode support in the standard library .

        16
  •  2
  •   Benjamin Middaugh    8 年前

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

        17
  •  1
  •   Craig    7 年前

    菲律宾比索

    已经有一个 entire thread 就这样!

        18
  •  1
  •   Craig    11 年前

    红宝石

    我能找到的Ruby的东西都已经很旧了,也不是什么rubist了,我不确定它有多精确。

    据记录,Ruby支持utf8,但不支持多字节。在内部,它通常假设字符串是字节向量,尽管有一些库和技巧通常可以用来使事情正常工作。

    发现了 here .

    红宝石1.9

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

        19
  •  0
  •   baudtack    15 年前

    Arc

    Arc不支持任何unicode。 Yet .

        20
  •  0
  •   cyclaminist    6 年前

    卢阿

    Lua5.3有一个内置的 utf8 处理UTF-8编码的库。它允许您将一系列代码点转换为相应的字节序列,然后反过来,获取长度(字符串中的代码点数量),迭代字符串中的代码点,获取 n个 第个码位。它还提供了一个模式,供 string 库,它将匹配一个UTF-8字节序列。

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

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