Created
January 10, 2018 15:03
-
-
Save darkhandz/e56e76fb251df7aa997487330b26f1c6 to your computer and use it in GitHub Desktop.
Swift按GBK编码截取字符串
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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