Swiftで文字列をバイト単位で切り出し

時は21世紀をとうに迎えたというのに。
巷では量子コンピュータだの人工知能だのVRだのが話題になっているというのに。
何ゆえバイト数を考慮しなけらばならないのか。
解せぬ、解せぬぞ。
というわけでSwiftで文字列のバイト切り出し方法です。




ソースコード


/// 汎用クラス
class Common {
 
 ///
 /// 先頭からnバイト切り出し
 /// - parameter text: 切り出し対象文字列
 /// - parameter n: 切り出しバイト数
 /// - parameter encoding: 文字エンコード:デフォルトShiftJIS
 ///     - NSShiftJISStringEncoding
 ///     - NSUTF8StringEncoding
 ///     - NSJapaneseEUCStringEncoding
 ///     - NSUnicodeStringEncoding
 ///     - NSASCIIStringEncoding
 /// - returns: 切り出し後の文字列
 /// ```
 /// var text = "アイウエオか12345"
 /// text = Common.substringToByte(from: text, n: 15)
 /// print(text) // アイウエオか123
 /// ```
 ///
 static func substringToByte(
  from text:String, 
  n: Int, 
  encoding: NSStringEncoding = NSShiftJISStringEncoding) -> String {
     
     var byte = 0
     var result = ""
      
     text.characters.forEach {
         let char = $0.debugDescription.
          stringByReplacingOccurrencesOfString( "\"", withString: "" )
         let charLength = char.lengthOfBytesUsingEncoding(encoding)
         
         if n >= byte + charLength {
             byte = byte + charLength
             result = result + char
         }
         
     }
     
     return result
 }
}




解説


テキストを一文字単位でforEachで処理。
debugDescriptionにはダブルクォーテーションが入ってくるので除外。
lengthOfBytesUsingEncodingで文字コードに対応する文字のバイト数を取得。
今回はNSShiftJISStringEncoding.
nバイトを超えないところまで一文字ずつresultに文字列結合。


いじょ


文字単位の操作をしたい場合は以下
Swift2の文字列処理・切り出し方法をまとめた(substring)


2016年10月13日木曜日