投稿

10月, 2015の投稿を表示しています

Swift 2.0でStringはどうなったか - 特殊文字などの扱い

イメージ
Objective-CのNSStringの仕様は自然ではなかったので、Swiftには期待しています。 Swift2.0でStringの仕様がだいぶ変わったということで検証してみます。 昔は何が困ったか 今回のStringの仕様の検証は、昔の仕様で困っていた部分が動機になっているので、まずそれを書きます。NSStringでは文字を基本的に16ビットで扱っていますが、文字の中には16ビットで扱えないものがあり、そういうものは32ビットなど他の長さで使用します。そのごちゃごちゃはUnicodeの仕様上仕方ないのですが、NSStringではその32ビット文字を2文字としてカウントするなどUnicodeのごちゃごちゃをうまくさばききれていなくて扱いが雑な部分がありました。 欲しいものは、内部で何ビットだろうとどういうどういうデータ状態であろうと、人間が一文字と認識するものは一文字として扱うというポリシーに従ったAPIです。 Swiftが発表になったときにUnicodeとの親和性もアピールしていたので期待しています。 The Swift Programming Languageを読む まずはいつものThe Swift Programming Languageで基本をおさらい。 ・Stringはvalue typeである(reference typeではない)。 ・Stringの文字列に含まれている個々の文字へのアクセスにはStringのcharactersプロパティからアクセス出来る。 ・SwiftのStringは内部ではUnicode scalarをベースにしている。Unicode scalarとは文字や記号に対応する21ビットの数。U+0000からU+D7FFとU+E000からU+10FFFFがある。U+D800からU+DFFFは含まない。U+が何かというのは大変ややこしいので割愛。 ・人間が文字と認識する形式がExtended Grapheme Cluster。SwiftのCharacterは一つのExtended Grapheme Clusterに対応。 一つのExtended Grapheme Clusterは一つ以上のUnicode scalarで構成される 。 ・Stringの文字数カウントはcharactersプロパティのcountプロ