像其他一些表情符号字符一样,U+1F1E9 U+1F1EA组合(德国国旗🇩🇪)在屏幕上表示为单个字符,尽管它实际上是两个不同的Unicode字符点组合。它在Swift中是表示为一个还是两个不同的字符?
z31licg01#
let flag = "\u{1f1e9}\u{1f1ea}"
那么flag是🇩🇪。有关更多区域指示器符号,请参见:http://en.wikipedia.org/wiki/Regional_Indicator_Symbol
flag
oewdyzsn2#
与此同时,Swift中增加了对“扩展字素簇”的支持。迭代字符串的字符会为“flags”生成一个字符:
let string = "Hi🇩🇪!" for char in string.characters { print(char) }
输出:
H i 🇩🇪 !
ycl3bljg3#
Swift 3在其String结构中实现了Unicode。在Unicode中,所有的标志都是成对的Regional Indicator Symbols。因此,🇩🇪实际上是🇩,后面跟着🇪(尝试复制这两个并将它们粘贴到彼此旁边!).当两个或两个以上的区域指示符彼此相邻放置时,它们形成“扩展字形簇”,这意味着它们被视为一个字符。这就是为什么"🇪🇺 = 🇫🇷🇪🇸🇩🇪...".characters给你["🇪🇺", " ", "=", " ", "🇫🇷🇪🇸🇩🇪", ".", ".", "."]。如果您想查看每个Unicode码位(也称为“标量”),可以使用.unicodeScalars,这样"Hi🇩🇪!".unicodeScalars就得到["H", "i", "🇩", "🇪", "!"]
String
🇩🇪
🇩
🇪
"🇪🇺 = 🇫🇷🇪🇸🇩🇪...".characters
["🇪🇺", " ", "=", " ", "🇫🇷🇪🇸🇩🇪", ".", ".", "."]
.unicodeScalars
"Hi🇩🇪!".unicodeScalars
["H", "i", "🇩", "🇪", "!"]
🇩🇪 是一个***字符***(在Swift和Unicode中),它由两个***代码点***(AKA标量)组成。别忘了它们是不同的!🙂
ewm0tg9j4#
在Swift 5中,你可以遍历标志emoji字符的unicodeScalars属性,以打印组成它的Unicode标量值:
unicodeScalars
let emoji: Character = "🇮🇹" for scalar in emoji.unicodeScalars { print(scalar) } /* prints: 🇮 🇹 */
如果将这些标量(即区域指示符号)组合在一起,您将获得一个旗帜表情符号:
let italianFlag = "🇮" + "🇹" print(italianFlag) // prints: 🇮🇹 print(italianFlag.count) // prints: 1
每个Unicode.Scalar示例还有一个属性value,您可以使用它来显示它的数字表示:
Unicode.Scalar
value
let emoji: Character = "🇮🇹" for scalar in emoji.unicodeScalars { print(scalar.value) } /* prints: 127470 127481 */
您可以从这些数字表示创建Unicode标量,然后将它们关联到字符串中:
let scalar1 = Unicode.Scalar(127470) let scalar2 = Unicode.Scalar(127481) let italianFlag = String(scalar1!) + String(scalar2!) print(italianFlag) // prints: 🇮🇹 print(italianFlag.count) // prints: 1
如果需要,可以使用Unicode.Scalar的escaped(asASCII:)方法来显示Unicode标量的字符串表示(使用ASCII字符):
escaped(asASCII:)
let emoji: Character = "🇮🇹" for scalar in emoji.unicodeScalars { print(scalar.escaped(asASCII: true)) } /* prints: \u{0001F1EE} \u{0001F1F9} */
let italianFlag = "\u{0001F1EE}\u{0001F1F9}" print(italianFlag) // prints: 🇮🇹 print(italianFlag.count) // prints: 1
String的init(_:radix:uppercase:)也可能与将标量值转换为十六进制值有关:
init(_:radix:uppercase:)
let emoji: Character = "🇮🇹" for scalar in emoji.unicodeScalars { print(String(scalar.value, radix: 16, uppercase: true)) } /* prints: 1F1EE 1F1F9 */
let italianFlag = "\u{1F1EE}\u{1F1F9}" print(italianFlag) // prints: 🇮🇹 print(italianFlag.count) // prints: 1
7rfyedvj5#
Swift没有告诉你String的内部表示是什么。您可以将String作为全尺寸(32位)Unicode代码点的列表进行交互:
for character in "Dog!🐶" { println(character) } // prints D, o, g, !, 🐶
如果要将字符串作为UTF-8或UTF-16代码点序列使用,请使用其utf8或utf16属性。请参阅文档中的字符串和字符。
utf8
utf16
5条答案
按热度按时间z31licg01#
那么
flag
是🇩🇪。有关更多区域指示器符号,请参见:
http://en.wikipedia.org/wiki/Regional_Indicator_Symbol
oewdyzsn2#
与此同时,Swift中增加了对“扩展字素簇”的支持。迭代字符串的字符会为“flags”生成一个字符:
输出:
ycl3bljg3#
Swift 3在其
String
结构中实现了Unicode。在Unicode中,所有的标志都是成对的Regional Indicator Symbols。因此,🇩🇪
实际上是🇩
,后面跟着🇪
(尝试复制这两个并将它们粘贴到彼此旁边!).当两个或两个以上的区域指示符彼此相邻放置时,它们形成“扩展字形簇”,这意味着它们被视为一个字符。这就是为什么
"🇪🇺 = 🇫🇷🇪🇸🇩🇪...".characters
给你["🇪🇺", " ", "=", " ", "🇫🇷🇪🇸🇩🇪", ".", ".", "."]
。如果您想查看每个Unicode码位(也称为“标量”),可以使用
.unicodeScalars
,这样"Hi🇩🇪!".unicodeScalars
就得到["H", "i", "🇩", "🇪", "!"]
tl;dr
🇩🇪 是一个***字符***(在Swift和Unicode中),它由两个***代码点***(AKA标量)组成。别忘了它们是不同的!🙂
另见
ewm0tg9j4#
在Swift 5中,你可以遍历标志emoji字符的
unicodeScalars
属性,以打印组成它的Unicode标量值:如果将这些标量(即区域指示符号)组合在一起,您将获得一个旗帜表情符号:
每个
Unicode.Scalar
示例还有一个属性value
,您可以使用它来显示它的数字表示:您可以从这些数字表示创建Unicode标量,然后将它们关联到字符串中:
如果需要,可以使用
Unicode.Scalar
的escaped(asASCII:)
方法来显示Unicode标量的字符串表示(使用ASCII字符):String
的init(_:radix:uppercase:)
也可能与将标量值转换为十六进制值有关:7rfyedvj5#
Swift没有告诉你
String
的内部表示是什么。您可以将String
作为全尺寸(32位)Unicode代码点的列表进行交互:如果要将字符串作为UTF-8或UTF-16代码点序列使用,请使用其
utf8
或utf16
属性。请参阅文档中的字符串和字符。