web-dev-qa-db-ja.com

????????文字はSwift文字列でどのように表されますか?

他のいくつかの絵文字と同様に、0x0001F1E9 0x0001F1EAの組み合わせ(ドイツ国旗)は、実際には2つの異なるUnicode文字ポイントを組み合わせたものですが、画面上では1つの文字として表されます。 Swiftでは1つまたは2つの異なる文字として表されていますか?

11
Max Yankov
let flag = "\u{1f1e9}\u{1f1ea}"

flagは???????? 。

その他の地域インジケーターシンボルについては、以下を参照してください。
http://en.wikipedia.org/wiki/Regional_Indicator_Symbol

25
NSDeveloper

その間、「拡張書記素クラスター」のサポートがSwiftに追加されました。文字列の文字を反復処理すると、「フラグ」の1文字が生成されます。

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

出力:

こんにちは
????????
!
6
Martin R

Swift 3は、そのString構造体にUnicodeを実装しています。 Unicodeでは、すべてのフラグは Regional Indicator Symbols のペアです。したがって、????????は実際には????の後に????が続きます(2つをコピーして、並べて貼り付けてみてください!)。

2つ以上の地域インジケーターシンボルを並べて配置すると、「拡張書記素クラスター」が形成されます。これは、1つの文字として扱われることを意味します。これが、"???????? = ????????????????????????...".characters["????????", " ", "=", " ", "????????????????????????", ".", ".", "."]を提供する理由です。

すべてのUnicodeコードポイント(別名「スカラー」)を表示する場合は、.unicodeScalarsを使用して、"Hi????????!".unicodeScalarsから["H", "i", "????", "????", "!"]を取得できます。

tl; dr

???????? 1つの文字(SwiftとUnicodeの両方)、これは2つのコードポイント(別名スカラー)で構成されています。これらは異なることを忘れないでください!????


関連項目

5
Ben Leggiero

Swiftは、Stringの内部表現が何であるかを教えてくれません。フルサイズ(32ビット)のUnicodeコードポイントのリストとしてStringを操作します。

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

文字列をUTF-8またはUTF-16コードポイントのシーケンスとして処理する場合は、そのutf8またはutf16プロパティを使用します。ドキュメントの 文字列と文字 を参照してください。

2
rickster

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
_
1
Imanou Petit