Unicode 文字列がテキストファイルや他のストレージに書き出されるとき、その文字列にある Unicode スカラは Unicode に定義された方式でエンコードされます。各形式は、コード単位という小さなまとまりで文字列をエンコードします。(8 ビットコード単位で文字列をエンコードする)UTF-8 エンコード方式、(16 ビットコード単位で文字列をエンコードする)UTF-16 エンコード方式、および(32 ビットコード単位で文字列をエンコードする)UTF-32 エンコード方式が含まれています。

Swift には、文字列の Unicode 表現にアクセスする方法がいくつかあります。forin 文で文字列内を繰り返し処理して、Unicode 拡張書記素クラスタとして個々の Character 値にアクセスすることができます。この処理は Working with Characters で説明されています。

あるいは、3 つの Unicode 準拠表現のうち 1 つで String 値にアクセスします。

  • UTF-8 コード単位のコレクション(文字列の utf8 プロパティでアクセス)
  • UTF-16 コード単位のコレクション(文字列の utf16 プロパティでアクセス)
  • UTF-21 Unicode スカラ値、文字列の UTF-32 エンコード方式に相当(文字列の unicodeScalars プロパティでアクセス)

以下の各例で、DogDOUBLE EXCLAMATION MARK または Unicode スカラ U+203C)および 🐶DOG FACE または Unicode スカラ U+1F436)で構成される文字列を異なる表現で示します。

let dogString = "Dog‼🐶"

UTF-8 表現

utf8 プロパティを繰り返し処理して String の UTF-8 表現にアクセスすることができます。このプロパティは String.UTF8View 型で、文字列の UTF-8 表現のバイトである符号無し 8 ビット (UInt8) 値のコレクションです。

image: UTF8_2x
for codeUnit in dogString.utf8 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// 68 111 103 226 128 188 240 159 144 182

この例では、初めの 3 つの codeUnit 数値 (68111103) で文字 Dog を表現しており、これらの UTF-8 表現 は ASCII 表現と同じです。次の 3 つの codeUnit 数値 (226128188) は、DOUBLE EXCLAMATION MARK 文字の 3 バイト UTF-8 表現です。最後の 4 つの codeUnit 値 (240159144182) は、DOG FACE 文字の 4 バイト UTF-8 表現です。

UTF-16 表現

utf16 プロパティを繰り返し処理して String の UTF-16 表現にアクセスすることができます。このプロパティは String.UTF16View 型で、文字列の UTF-16 表現の 16 ビットコード単位である符号無し 16 ビット (UInt16) 値のコレクションです。

image: UTF16_2x
for codeUnit in dogString.utf16 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// 68 111 103 8252 55357 56374

初めの 3 つの codeUnit 数値 (68111103) で文字 Dog を表現しており、これらの UTF-16 コード単位は(Unicode スカラが ASCII 文字を表現しているため)文字列の UTF-8 表現と同じ値になります。

4 番目の codeUnit 数値 (88252) は 16 進数値 203C と等しく、DOUBLE EXCLAMATION MARK 文字を Unicode スカラ U+203C で表現しています。この文字は UTF-16 で 1 つのコード単位として表現することができます。

5 番目と 6 番目の codeUnit 値 (55357 と 56374) は、DOG FACE 文字の UTF-16 サロゲートペア表現です。これらの値は、U+D83D(数値 55357)が上位サロゲート値で、U+DC36(数値 56374)が下位サロゲート値です。

Unicode スカラ表現

unicodeScalars プロパティを繰り返し処理して String 値の Unicode スカラ表現にアクセスすることができます。このプロパティは UnicodeScalarView 型で、UnicodeScalar型の値のコレクションです。

各 UnicodeScalar は、UInt32 値で表現されるスカラの 21 ビット値を返す value プロパティを持っています。

image: UnicodeScalar_2x
for scalar in dogString.unicodeScalars {
    print("\(scalar.value) ", terminator: "")
}
print("")
// 68 111 103 8252 128054

初めの 3 つの UnicodeScalar 値 (68111103) で文字 Dog を表現しています。

4 番目の codeUnit 数値 (8252) は 16 進数値 203C と等しく、DOUBLE EXCLAMATION MARK 文字を Unicode スカラ U+203C で表現しています。

5 番目で、最後の UnicodeScalar 値 (128054) は 16 進数値 1F436 と等しく、DOG FACE 文字を Unicode スカラ U+1F436 で表現しています。

value プロパティを利用する代わりに、新しい String 値を構築するために、各 UnicodeScalar 値を文字列補間で利用することができます。

for scalar in dogString.unicodeScalars {
    print("\(scalar) ")
}
// D
// o
// g
// ‼
// 🐶

Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.