我有一个 AVMetadataItem,它的字段以 CP1251(西里尔文)编码。阅读 item.stringValue 后,我得到垃圾 - 编码错误的字符串。我尝试将该字符串转换为原始 UTF8,然后使用 CP1251 编码创建一个新字符串 - 不走运,结果为零。尝试获取 item.dataValue - 没有骰子,它包含原始列表数据(以 bplist 开头......)。
任何想法都非常感谢。
提前致谢。
我有一个 AVMetadataItem,它的字段以 CP1251(西里尔文)编码。阅读 item.stringValue 后,我得到垃圾 - 编码错误的字符串。我尝试将该字符串转换为原始 UTF8,然后使用 CP1251 编码创建一个新字符串 - 不走运,结果为零。尝试获取 item.dataValue - 没有骰子,它包含原始列表数据(以 bplist 开头......)。
任何想法都非常感谢。
提前致谢。
斯威夫特 2.0 解决方案:
let origTitleMeta: NSData = (<AVMetadataItem>.timedMetadata?.first?.stringValue?.dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: true))!
let convertedTitleMeta: String = String(data: origMeta, encoding: NSUTF8StringEncoding)!
我最终使用了 Mike Ash 的 NSPropertyListReader_binary1 并获取原始数据,然后对其进行修改,以便 NSString 对其进行编码。
可怕 - 但有效。
我为此有 AVMetadataItem 扩展:
extension AVMetadataItem {
/// stringValue: ISO-8859-1 → UTF-8
var utf8String: String? {
guard let data = stringValue?.data(using: String.Encoding.isoLatin1, allowLossyConversion: true) else {
return nil
}
return String(data: data as Data, encoding: String.Encoding.utf8)
}
}
斯威夫特 3.0 解决方案:
let data: Data = item.timedMetadata!.first!.stringValue.data(using: String.Encoding.isoLatin1, allowLossyConversion: true)!
let title: String = String(data: data as Data, encoding: String.Encoding.utf8)!