首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Big5编码在iOS上的应用

Big5编码在iOS上的应用
EN

Stack Overflow用户
提问于 2017-05-19 07:07:21
回答 1查看 1.6K关注 0票数 1

我正在扫描一个用Big5编码的汉字的QR码.(主页概况)

是否有机会在Swift 3中正确解码该字符串?

我在目标-C示例上找到了GitHub和所以问题,但是Swift中没有kCFStringEncodingBig5_HKSCS_1999kCFStringEncodingBig常量。

更新:

我找到了相应的快速变量,所以我现在尝试如下:

代码语言:javascript
复制
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
    guard metadataObjects?.count ?? 0 > 0 else {
        return
    }
    guard let metadata = metadataObjects.first as? AVMetadataMachineReadableCodeObject, let code = metadata.stringValue else {
        return
    }
    let big5encoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.big5.rawValue)))
    print("Big5 encoded String: " + (String(data: code.data(using: .nonLossyASCII)!, encoding: big5encoding) ?? "?"))
}

输出:Big5 encoded String: \326\367\322\263\270\305\277\366

如何获得预期的输出Big5 encoded String: 主页概况

更新2:

似乎我的encoded包含了一些损坏的数据,所以我创建了一个新的代码,这一次内容肯定是Big5编码的字符串(Android正确地读取它)。内容为傳統

当我用iOS应用程序扫描这段代码时,metadata.stringValue返回日语字符串カヌイホ

这到底是怎么回事??

EN

回答 1

Stack Overflow用户

发布于 2017-05-19 07:30:27

CFStringEncodings定义为Swift 3中的枚举值:

代码语言:javascript
复制
public enum CFStringEncodings : CFIndex {

    // ...    
    case big5 /* Big-5 (has variants) */
    // ...    
    case big5_HKSCS_1999 /* Big-5 with Hong Kong special char set supplement*/
    // ...    
}

所以你必须转换

代码语言:javascript
复制
CFStringEncodings -> CFStringEncoding -> NSStringEncoding -> String.Encoding

示例:

代码语言:javascript
复制
let cfEnc = CFStringEncodings.big5
let nsEnc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEnc.rawValue))
let big5encoding = String.Encoding(rawValue: nsEnc) // String.Encoding

然后,big5encoding可以用于String(NS)Data之间的转换。

在您的示例中,您有一个字符串,其中每个unicode标量对应于Big5编码的一个字节。那么,以下几点应能奏效:

代码语言:javascript
复制
// let code = "\u{00D6}\u{00F7}\u{00D2}\u{00B3}\u{00B8}\u{00C5}\u{00BF}\u{00F6}"
let bytes = code.unicodeScalars.map { UInt8(truncatingBitPattern: $0.value) }
if let result = String(bytes: bytes, encoding: big5encoding) {
    print(result)
}

或者,使用ISO拉丁文1编码映射Unicode代码点U+0000。U+00FF到字节0x00 ..0xFF:

代码语言:javascript
复制
if let data = code.data(using: .isoLatin1),
    let result = String(data: data, encoding: big5encoding) {
    print(result)
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44063591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档