【问题标题】:String from NSData fails using UTF8 but succeeds using ASCII来自 NSData 的字符串使用 UTF8 失败,但使用 ASCII 成功
【发布时间】:2015-07-16 17:07:39
【问题描述】:

我正在扫描一些条形码并将它们解码为 Swift 字符串。特定的扫描器提供了一个对象,其中包含构建 NSData 所需的信息:

let rawData = decodedData.getData() // UnsafeMutablePointer<UInt8>
let rawDataSize = decodedData.getDataSize() // UInt32
let data = NSData(bytes: rawData, length: Int(rawDataSize)) // NSData

然后我把它解码成一个字符串:

let string = NSString(data: data, encoding: NSUTF8StringEncoding) as? String

我发现某些条形码在解码时返回 nil,除非我切换到 NSASCIIStringEncoding

let string = NSString(data: data, encoding: NSASCIIStringEncoding) as? String

我对字符串编码的理解有限,但我的印象是任何 ASCII 字符串都可以解码为 UTF8,因为 ASCII 是 UTF8 的子集。这准确吗?

如果是这样,还有什么可能导致此问题?

【问题讨论】:

    标签: utf-8 nsstring ascii nsdata barcode-scanner


    【解决方案1】:

    问题在于,如果解释为 UTF-8,则并非每个字节序列都是有效的。例如,值为 0xff = 255 的单个字节在 UTF-8 中永远无效。另一方面,可能是 ASCII 编码允许每个字节值,即使这并不正确。

    你最好好好看看数据,看看它实际上是什么编码。如果它只是随机字节,那么请不要将它们转换为字符串。

    【讨论】:

    • 肯定是字符串(解码后的数据是有意义且可识别的)。我该如何确定编码?我目前的方法一直在反复试验 - NSASCIIStringEncoding 是唯一将我的所有示例正确解码为我预期的文本的编码。
    猜你喜欢
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多