Swift字符串中的emoji标志字符是如何表示的?

cig3rfwq  于 2023-05-16  发布在  Swift
关注(0)|答案(5)|浏览(258)

像其他一些表情符号字符一样,U+1F1E9 U+1F1EA组合(德国国旗🇩🇪)在屏幕上表示为单个字符,尽管它实际上是两个不同的Unicode字符点组合。它在Swift中是表示为一个还是两个不同的字符?

z31licg0

z31licg01#

let flag = "\u{1f1e9}\u{1f1ea}"

那么flag是🇩🇪。
有关更多区域指示器符号,请参见:
http://en.wikipedia.org/wiki/Regional_Indicator_Symbol

oewdyzsn

oewdyzsn2#

与此同时,Swift中增加了对“扩展字素簇”的支持。迭代字符串的字符会为“flags”生成一个字符:

let string = "Hi🇩🇪!"
for char in string.characters {
    print(char)
}

输出:

H
i
🇩🇪
!
ycl3bljg

ycl3bljg3#

Swift 3在其String结构中实现了Unicode。在Unicode中,所有的标志都是成对的Regional Indicator Symbols。因此,🇩🇪实际上是🇩,后面跟着🇪(尝试复制这两个并将它们粘贴到彼此旁边!).
当两个或两个以上的区域指示符彼此相邻放置时,它们形成“扩展字形簇”,这意味着它们被视为一个字符。这就是为什么"🇪🇺 = 🇫🇷🇪🇸🇩🇪...".characters给你["🇪🇺", " ", "=", " ", "🇫🇷🇪🇸🇩🇪", ".", ".", "."]
如果您想查看每个Unicode码位(也称为“标量”),可以使用.unicodeScalars,这样"Hi🇩🇪!".unicodeScalars就得到["H", "i", "🇩", "🇪", "!"]

tl;dr

🇩🇪 是一个***字符***(在Swift和Unicode中),它由两个***代码点***(AKA标量)组成。别忘了它们是不同的!🙂

另见

ewm0tg9j

ewm0tg9j4#

在Swift 5中,你可以遍历标志emoji字符的unicodeScalars属性,以打印组成它的Unicode标量值:

let emoji: Character = "🇮🇹"
for scalar in emoji.unicodeScalars {
    print(scalar)
}
/*
 prints:
 🇮
 🇹
 */

如果将这些标量(即区域指示符号)组合在一起,您将获得一个旗帜表情符号:

let italianFlag = "🇮" + "🇹"
print(italianFlag) // prints: 🇮🇹
print(italianFlag.count) // prints: 1

每个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.Scalarescaped(asASCII:)方法来显示Unicode标量的字符串表示(使用ASCII字符):

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

Stringinit(_: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
7rfyedvj

7rfyedvj5#

Swift没有告诉你String的内部表示是什么。您可以将String作为全尺寸(32位)Unicode代码点的列表进行交互:

for character in "Dog!🐶" {
    println(character)
}
// prints D, o, g, !, 🐶

如果要将字符串作为UTF-8或UTF-16代码点序列使用,请使用其utf8utf16属性。请参阅文档中的字符串和字符。

相关问题