巷では量子コンピュータだの人工知能だの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)