来自 NSData 的字符串使用 UTF8 失败但使用 ASCII 成功

String from NSData fails using UTF8 but succeeds using ASCII

我正在扫描一些条形码并将它们解码为 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

我发现解码时某些条码 return 为零,除非我切换到 NSASCIIStringEncoding:

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

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

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

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

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