Swift的String文档中的'Swift are Unicode correct and locale insensitive'是什么意思?

What is the meaning of 'Swift are Unicode correct and locale insensitive' in Swift's String document?

我在Swift的字符串文档中找到了这句话 (https://developer.apple.com/documentation/swift/string)

概览

字符串是一系列字符,例如“Swift”,它们构成一个集合。 Swift 中的字符串是 Unicode 正确且不区分区域设置, 并且旨在高效。 String 类型与 Objective-C class NSString 桥接,并提供与处理字符串的 C 函数的互操作性。

但是,我百分百看不懂,也不知道从何说起。

基本上就是说Swift字符串是Unicode字符串。 Swift 字符串“字符”是 Unicode 意义上的字符:字母、表情符号、字母和变音符号的组合等等。字符串不仅可以看作字符序列,还可以看作 UTF8、16 或 32 位代码点的序列。 “语言环境不敏感”的东西意味着它们没有语言环境相关的编码,就像字符串在 Unicode 出现之前的糟糕日子里所做的那样。

这很令人愉快,但它也有一些缺点,最值得注意的是作为字符序列的字符串不能直接由整数索引。

稍微扩展一下@matt 的回答:

Unicode Consortium maintains certain standards for interoperation of data, and one of the most well-known standards is the Unicode string standard。该标准定义了大量字符及其属性,以及这些字符如何相互交互的规则。 (如 Matt 注释:字母、表情符号、组合字符 [带变音符号的字母,如 é 等)

Swift 字符串是“Unicode 正确的”意味着 Swift 字符串符合此 Unicode 标准,提供与符合相同标准的任何其他字符串实现相同的字符、规则和交互标准。如今,作为许多字符串实现已经符合的主要标准,这在很大程度上意味着 Swift 字符串将“正常工作”,就像您期望的那样。

但是,除了字符定义之外,Unicode 还定义了许多规则来执行某些常见的字符串操作,例如大写和小写字符串,或对它们进行排序。这些规则可能非常具体,在许多情况下,完全取决于上下文(例如,区域设置,或者文本可能属于或显示的语言和区域)。例如:

  • 大小写转换:
    • 在英语中,i(Unicode 中的“LATIN SMALL LETTER I”)的大写形式是 I(“LATIN CAPITAL LETTER I”),反之亦然
    • 然而,在土耳其语中,i 的大写形式实际上是 İ(“带点的拉丁文大写字母 I”),而 I 的小写形式(“拉丁文大写字母 I") 是 ı(“拉丁文小写字母 DOTLESS I”)
  • 整理(排序)
    • 在英语中,字母 Å(“带环的拉丁文大写字母 A”)在很大程度上被认为与字母 A(“拉丁文大写字母 A”)相同,只是带有一个修饰符。在列表中排序,以 Å 开头的单词将与其他 A 个单词一起出现,但在 B 个单词
    • 之前
    • 然而,在某些斯堪的纳维亚语言中,Å 是其 自己的 字母,与 A 不同。在丹麦语和挪威语中,Å 位于字母表的 末尾 ... X, Y, Z, Æ, Ø, Å。在瑞典语和芬兰语中,字母表以:... X, Y, Z, Å, Ä, Ö 结尾。对于这些语言,以 Å 开头的单词将在 之后出现 Z 列表中的单词

为了以对不同语言的用户有意义的方式执行许多字符串操作,这些操作需要在他们的语言和区域设置的上下文中执行。

在文档描述的上下文中,“语言环境不敏感”意味着 Swift 字符串 提供像这样的语言环境特定规则,并且默认为 Unicode 的默认大小写转换、大小写折叠和排序规则(有效:英语)。因此,在需要正确处理这些的上下文中(例如,您正在编写一个本地化的应用程序),您需要使用 Foundation 对 String 方法的扩展,这些方法确实需要 Locale 来进行正确处理:

等等。