Skip to content

Instantly share code, notes, and snippets.

@darkhandz
Created January 10, 2018 15:03
Show Gist options
  • Save darkhandz/e56e76fb251df7aa997487330b26f1c6 to your computer and use it in GitHub Desktop.
Save darkhandz/e56e76fb251df7aa997487330b26f1c6 to your computer and use it in GitHub Desktop.
Swift按GBK编码截取字符串
import Foundation
extension String {
/// 用GBK编码时的长度
var gbkLength: Int {
let cfEncoding = CFStringEncodings.GB_18030_2000
let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEncoding.rawValue))
let gbkData = (self as NSString).data(using: encoding)!
let gbkBytes = [UInt8](gbkData)
return gbkBytes.count
}
/** 按GBK编码后,截取maxLen长度的字符,中文字符切不开则退避1个字节 */
func trimToGBKLength(_ maxLen: Int) -> String {
let cfEncoding = CFStringEncodings.GB_18030_2000
let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEncoding.rawValue))
let gbkData = (self as NSString).data(using: encoding)!
let gbkBytes = [UInt8](gbkData)
if maxLen >= gbkBytes.count {
return self
} else if maxLen < 1 {
return ""
} else {
if let str = NSString(data: gbkData[0..<maxLen], encoding: encoding) {
return str as! String
} else if let str = NSString(data: gbkData[0..<maxLen - 1], encoding: encoding) {
return str as! String
} else {
return ""
}
}
}
}
print("test".gbkLength)
print("test123".gbkLength)
print("44.45".gbkLength)
print("te,*st".gbkLength)
print("中文".gbkLength)
print("中文123,4".gbkLength)
for i in 0..<15 {
let cut = "中文,123你,4是".trimToGBKLength(i)
print("长度\(i): \(cut)")
}
/* output
4
7
5
6
4
9
4
长度0:
长度1:
长度2: 中
长度3: 中
长度4: 中文
长度5: 中文
长度6: 中文,
长度7: 中文,1
长度8: 中文,12
长度9: 中文,123
长度10: 中文,123
长度11: 中文,123你
长度12: 中文,123你,
长度13: 中文,123你,4
长度14: 中文,123你,4
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment