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

Utf 8 NSData中的字符串使用UTF8失败,但使用ASCII成功,utf-8,nsstring,ascii,nsdata,barcode-scanner,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)) // NS

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

let rawData = decodedData.getData() // UnsafeMutablePointer<UInt8>
let rawDataSize = decodedData.getDataSize() // UInt32
let data = NSData(bytes: rawData, length: Int(rawDataSize)) // NSData
我发现某些条形码在解码时返回nil,除非我切换到
NSASCIIStringEncoding

let string = NSString(data: data, encoding: NSASCIIStringEncoding) as? String
我对字符串编码的理解是有限的,但我的印象是,任何ASCII字符串都可以解码为UTF8,因为ASCII是UTF8的子集。这准确吗


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

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

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

它当然是一个字符串(解码的数据是有意义和可识别的)。如何确定编码?我目前的方法是反复试验-NSASCIIStringEncoding是唯一一种能够将我所有的示例正确解码为我预期的文本的编码。
let string = NSString(data: data, encoding: NSASCIIStringEncoding) as? String