NSData中的字符串使用UTF8失败,但使用ASCII成功

时间:2015-07-16 17:07:39

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

我正在扫描一些条形码并将它们解码为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的子集。这准确吗?

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

1 个答案:

答案 0 :(得分:2)

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

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