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

时间:2014-06-02 22:18:06

标签: unicode emoji swift

与其他一些表情符号字符一样,0x0001F1E9 0x0001F1EA组合(德国标志)在屏幕上表示为单个字符,尽管它实际上是两个不同的Unicode字符点组合在一起。它在Swift中表示为一个或两个不同的字符吗?

5 个答案:

答案 0 :(得分:24)

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

然后flag是。

有关更多区域指标符号,请参阅:
http://en.wikipedia.org/wiki/Regional_Indicator_Symbol

答案 1 :(得分:6)

支持"扩展的字形集群"在此期间,Swift已被添加到了Swift中。 迭代字符串的字符会产生单个字符 "标志":

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

输出:

H
i

!

答案 2 :(得分:5)

Swift 3在其String结构中实现了Unicode。在Unicode中,所有标志都是Regional Indicator Symbols对。因此,实际上是,后跟(尝试复制这两个并将它们粘贴在彼此旁边!)。

当两个或多个区域指示符号彼此相邻放置时,它们形成“扩展字形集群”,这意味着它们被视为一个字符。这就是" = ...".characters为您提供["", " ", "=", " ", "", ".", ".", "."]

的原因

如果您想查看每个Unicode代码点(AKA“标量”),可以使用.unicodeScalars,以便"Hi!".unicodeScalars为您提供["H", "i", "", "", "!"]

TL;博士

是一个 字符 (在Swift和Unicode中),由两个 代码点 组成(AKA标量)。不要忘记这些是不同的!

另见

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:0)

使用Swift 5,您可以遍历标志表情符号字符的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.Scalar的{​​{3}}方法来显示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

String的{​​{3}}也可能与将标量值转换为十六进制值有关:

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