他のいくつかの絵文字と同様に、0x0001F1E9 0x0001F1EAの組み合わせ(ドイツ国旗)は、実際には2つの異なるUnicode文字ポイントを組み合わせたものですが、画面上では1つの文字として表されます。 Swiftでは1つまたは2つの異なる文字として表されていますか?
let flag = "\u{1f1e9}\u{1f1ea}"
flag
は???????? 。
その他の地域インジケーターシンボルについては、以下を参照してください。
http://en.wikipedia.org/wiki/Regional_Indicator_Symbol
その間、「拡張書記素クラスター」のサポートがSwiftに追加されました。文字列の文字を反復処理すると、「フラグ」の1文字が生成されます。
let string = "Hi????????!"
for char in string.characters {
print(char)
}
出力:
こんにちは ???????? !
Swift 3は、そのString
構造体にUnicodeを実装しています。 Unicodeでは、すべてのフラグは Regional Indicator Symbols のペアです。したがって、????????
は実際には????
の後に????
が続きます(2つをコピーして、並べて貼り付けてみてください!)。
2つ以上の地域インジケーターシンボルを並べて配置すると、「拡張書記素クラスター」が形成されます。これは、1つの文字として扱われることを意味します。これが、"???????? = ????????????????????????...".characters
が["????????", " ", "=", " ", "????????????????????????", ".", ".", "."]
を提供する理由です。
すべてのUnicodeコードポイント(別名「スカラー」)を表示する場合は、.unicodeScalars
を使用して、"Hi????????!".unicodeScalars
から["H", "i", "????", "????", "!"]
を取得できます。
???????? 1つの文字(SwiftとUnicodeの両方)、これは2つのコードポイント(別名スカラー)で構成されています。これらは異なることを忘れないでください!????
Swiftは、String
の内部表現が何であるかを教えてくれません。フルサイズ(32ビット)のUnicodeコードポイントのリストとしてString
を操作します。
for character in "Dog!????" {
println(character)
}
// prints D, o, g, !, ????
文字列をUTF-8またはUTF-16コードポイントのシーケンスとして処理する場合は、そのutf8
またはutf16
プロパティを使用します。ドキュメントの 文字列と文字 を参照してください。
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
_の escaped(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
_
String
's init(_:radix:uppercase:)
は、スカラー値を16進値に変換する場合にも関連する場合があります。
_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
_