Кодирование AVMetadataItem
У меня есть AVMetadataItem, который имеет поля, закодированные в CP1251 (кириллица). После прочтения item.stringValue я получаю мусор - неправильно закодированную строку. Я попытался преобразовать эту строку в сырой UTF8, а затем создать новую строку с использованием кодировки CP1251 - не повезло, результат равен нулю. Попробовал взять item.dataValue - без кубиков, он содержит необработанные данные списка (начиная с bplist...).
Любые идеи очень ценятся.
Заранее спасибо.
4 ответа
Решение
Я закончил тем, что использовал NSPropertyListReader_binary1 Майка Эша и получил необработанные данные, а затем обработал их так, чтобы NSString кодировал их.
Ужасно - но сработало.
Решение Swift 2.0:
let origTitleMeta: NSData = (<AVMetadataItem>.timedMetadata?.first?.stringValue?.dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: true))!
let convertedTitleMeta: String = String(data: origMeta, encoding: NSUTF8StringEncoding)!
У меня есть расширение 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)
}
}
Решение Swift 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)!