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
来进行正确处理:
localizedUppercase
/uppercased(with locale: Locale?)
超过 uppercased()
localizedLowercase
/lowercased(with locale: Locale?)
超过 lowercased()
localizedStandardCompare(_:)
/compare(_:options:range:locale:)
超过 <
等等。
我在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
来进行正确处理:
localizedUppercase
/uppercased(with locale: Locale?)
超过uppercased()
localizedLowercase
/lowercased(with locale: Locale?)
超过lowercased()
localizedStandardCompare(_:)
/compare(_:options:range:locale:)
超过<
等等。