More Related Content
Similar to Strings and Characters in Swift (8)
More from Goichi Hirakawa (9)
Strings and Characters in Swift
- 2. 自己紹介
• 平川 剛一 (Goichi Hirakawa)
• @gooichi
• OS X / iOSプログラマ
• Objective-C歴XX年…
- 11. Unicode用語
• コードポイント(Code Point)
• Unicodeコード空間の任意の値; すなわち0から10FFFF(21-bit)
• コード単位(Code Unit)
• 符号化されたテキストの単位を表現する最小bitの組み合わせ
• Unicodeスカラ(Unicode Scalar)= SwiftのUnicodeScalar
• 上位/下位サロゲートペアのコードポイントを除く任意のコードポイント
• 具体的には、0∼D7FFとE000∼10FFFF
• UTF-32と同じ
• 拡張書記素クラスタ(Extended Grapheme Cluster)= SwiftのCharacter
• 人が読める単一の文字を生成する1つ以上のUnicodeスカラのシーケンス
- 16. Unicodeの等価性
• 正準等価(Canonical Equivalent)
• 異なるUnicodeスカラでも同じ言語的意味と外観を持つ
拡張書記素クラスタ
• 例)U+00E9 ( é ) == U+0065 ( e ) + U+0301 ( ́ )
• 互換等価(Compatibility Equivalent)
• 正準等価より更に広い範囲を等価とみなす弱い等価性
• フォント、改行、丸囲み、幅、回転、上付き下付き、組文字、分数等々
• 例)U+2460 ( ① ) == U+0031( 1 )
- 18. 等価性サンプル (1)
• Swift
let string1 = "u{E9}" // é
let string2 = "u{65}u{301}" // e + ́
print(string1 == string2) // true
• Objective-C
let nsString1: NSString = string1
print(nsString1 == string2) // false
print(nsString1.isEqualToString(string2)) // false
print(nsString1.compare(string2)
== NSComparisonResult.OrderedSame) // true
- 20. 等価性サンプル (2)
• 塚 と (外観が異なるが互換漢字)
let unifiedKanji = "u{585A}" // 塚
let compatiKanji = "u{FA10}" //
print(unifiedKanji == compatiKanji) // true
• 崎 と (互換漢字ではなく統合漢字)
let unifiedKanji = "u{5D0E}" // 崎
let nonCompatiKanji = "u{FA11}" //
print(unifiedKanji == nonCompatiKanji) // false
- 21. 異体字セレクタ
• IVS: Ideographic Variation Sequence/Selector
• 文字の字形をより詳細に指定する選択子
• それぞれの文字コードの後に選択子を追加
• 統合された異体字を区別するために追加
• 正規化の影響を受けない( 正準等価 でない)
- 22. 漢字コードサンプル
塚 と (それ以外の関連字は省略)
種類 コードシーケンス 表示
CJK統合漢字 U+585A 塚
CJK互換漢字 U+FA10
IVS
U+585A U+E0100 ※1
U+585A U+E0103 ※2
塚
U+585A U+E0101 ※1
U+585A U+E0105 ※2
標準異体字 ※3 U+585A U+FE01 塚
U+585A U+FE00
※1 アドビシステムズが Adobe-Japan1 で登録
※2 汎用電子が Hanyo-Denshi で登録
※3 Unicode標準で命名し定義、IVSとの違いはない
- 23. 等価性サンプル (3)
• CJK統合漢字とCJK互換漢字のみ等価
let unifiedKanji = "u{585A}" // 塚
let compatiKanji = "u{FA10}" //
print(unifiedKanji == compatiKanji) // true
• それ以外の組み合わせはすべて非等価
• IVS同士でも異体字セレクタが異なれば非等価
(Adobe-Japan1とHanyo-Denshiは非互換)
let adobeKanji = "u{585A}u{E0100}" // 塚
let hanyoKanji = "u{585A}u{E0103}" // 塚
print(adobeKanji == hanyoKanji) // false