本项目是受Yasuhiro Hatta的 Iconv项目启发而实现的Swift ICONV 类库。详见https://github.com/yaslab/Iconv
本项目通过SPM进行编译,是Perfect 项目的一个组成部分。
import PerfectICONV
do {
let i = try Iconv()
let bytes:[UInt8] = [0xd6, 0xd0, 0xb9, 0xfa, 0x0a]
guard let cn = i.utf8(buf: bytes) else {
XCTFail("fault")
return
}//end guard
print(cn)
XCTAssertTrue(cn.hasPrefix("中国"))
}catch(let err) {
XCTFail("ERROR: \(err)")
}
请在您的项目的Pacakge.swift 文件中增加如下依存关系:
.Package(url: "https://github.com/PerfectSideRepos/Perfect-ICONV.git",
majorVersion:3)
随后请将iconv库函数声明到您的源代码:
import PerfectICONV
在进行文字转码之前,请首先初始化函数库:
do {
let iconv = try Iconv(from: .GB2312, to: .UTF_8)
}catch(let err) {
/// 如果编码协议名称无效,则可能会出错
}
enum
即可:
public enum CodePage: String {
case US = "US"
case US_ASCII = "US-ASCII"
case CSASCII = "CSASCII"
case UTF_8 = "UTF-8"
case UTF8 = "UTF8"
...
}
PerfectICONV 提供了若干中方便的转码方法:
iconv.utf8(bytes: [Int8])
或者iconv.utf8(bytes: [UInt8])
: 直接将有符号或者无符号的二进制码流转换为UTF8字符串
let bytes:[UInt8] = [0xd6, 0xd0, 0xb9, 0xfa, 0x0a]
guard let china = iconv.utf8(buf: bytes) else {
/// 出错了!
}//end guard
// 如果没错,会显示 "中国"
print(china)
iconv.convert(buf: [Int8]) -> [Int8]
oriconv.convert(buf: [UInt8]) -> [UInt8]
: 在二进制码流之间互相转换
let bytes:[UInt8] = [0xd6, 0xd0, 0xb9, 0xfa, 0x0a]
let chinaBytes = iconv.convert(buf: bytes)
// 如果没错的话,chinaBytes内容就是一个新的二进制码流
iconv.convert(buf: UnsafePointer<Int8>, length: Int) -> (UnsafeMutablePointer<Int8>?, Int)
: 与Hatta原项目函数设计类似,将原码流以指针和长度为参数,转换为一个新的指针和新长度构成的元组。⚠️ 注意⚠️ 如果使用指针,请务必手动释放内存!
关于本项目更多内容,请参考perfect.org.