Avatar
let str = "こんにちは!" let u8Str = str.utf8 let ucStr = str.unicodeScalars // ユニコードスカラとしての2文字目の位置のUTF8表現のバイト値を求めるコード let ucIndex2: String.UnicodeScalarView.Index = ucStr.index(ucStr.startIndex, offsetBy: 2) let strIndex2: String.Index = String.Index(ucIndex2, within: ucStr)! let u8Index2: String.UTF8View.Index = strIndex2.samePosition(in: u8Str)! let u8ByteOffset2: Int = u8Str.distance(from: u8Str.startIndex, to: u8Index2) print(u8ByteOffset2) // 6 print(u8Str[u8Index2]) // 227 <- 答え // 確認 print(str[String.Index(u8Index2, within: u8Str)!]) // に (edited)
8:17 AM
僕が「意識しないといけない」と思っているのは、 この、 strIndex2, u8Index2 への代入文の右辺の within:in: に、正しいものを入れないとちゃんと動かないからです
8:19 AM
あ〜
8:19 AM
変換という考え方を捨てて、View上でのIndexの位置を調べる、と考えると良いと思います。
8:21 AM
(String.Index と UTF8View.Index)、(String.IndexとUTF16View.Index)、それぞれの間での distance は正しく動く・・・?
8:23 AM
根っこのバイト表現上でのIndexになるから、 (UTF8View.IndexとUTF16View.Index) でも正しいってこと・・・?