Swift

Swift:サロゲートペア問題とは?

サロゲートペア問題とは何か?サンプルプログラムを作成して確かめました。

たとえば表示された「ひらがな濁音」の文字を含む「かぎ」は2文字に見えます。しかし、内部コードが“かき\u{3099}”となっていたらどうでしょう?これがサロゲートペア問題と呼ばれるものらしいです。

let wdata1 = “かき\u{3099}く\u{3099}け\u{3099}こ\u{3099}
println(wdata1) //かぎぐげご

  1. 目で見える文字数は5文字です。
  2. 文字数は5文字がtrueか? (5 == countElements(wdata1))=true
  3. NSStringによる文字数? (wdata1 as NSString).length=9
  4. unicodeScalarsによる文字数? countElements(wdata1.unicodeScalars)=9
  5. utf8によるバイト数? countElements(wdata1.utf8)=27
  6. var wcharGot:String = “”

wdata1から1文字ずつwcharGotに取り出すプログラムを作成して調べてみました。
var wcharGot:String = “”
for (R15, wchar) in enumerate(wdata1) { 
  range   = (wdata1 as NSString).rangeOfComposedCharacterSequenceAtIndex(R15)
  wcharGot += String(wchar)  
  var wCharGot2 = (wdata1 as NSString!).substringToIndex(R15+1)
  println(“R15=\(R15) range.location=\(range.location)
  range.length=\(range.length)
  (wcharGot as NSString).length=\((wcharGot as NSString).length)
  wcharGot=\(wcharGot)
  (wdata1 as NSString!).substringToIndex(R15+1)=\(wCharGot2)
  文字数countElements=\(countElements(wCharGot2))”)
}

  • wcharGot += String(wchar)  で1文字ずつスタックされます。

wcharGot=か
wcharGot=かぎ
wcharGot=かぎぐ
wcharGot=かぎぐげ
wcharGot=かぎぐげご

  • wCharGot2 = (wdata1 as NSString!).substringToIndex(R15+1) で1文字ずつスタックしているつもりでも、実際は、濁点のところで、文字位置R15は+1ずつ増えていきますが、文字数のカウントは上がっていません。

countElements(wCharGot2)=1 wCharGot2=か
countElements(wCharGot2)=2 wCharGot2=かき
countElements(wCharGot2)=2 wCharGot2=かぎ
countElements(wCharGot2)=3 wCharGot2=かぎく
countElements(wCharGot2)=2 wCharGot2=かぎぐ

ソースコード:

サンプルプログラムSwiftSampleCodeのソースコードは最新のものに置き換えました。サロゲートペア問題関連のサンプルプログラムは、TestCharHandlingという名前のクラスに入っています。

Categories: Swift, 技術