Кодирование AVMetadataItem

У меня есть AVMetadataItem, поля которого закодированы в CP1251 (кириллица). После прочтения item.stringValue получаю мусор - неправильно закодированную строку. Я попытался преобразовать эту строку в необработанный UTF8, а затем создать новую строку с использованием кодировки CP1251 - не повезло, результат нулевой. Попытался взять item.dataValue - без кубиков, он содержит необработанные данные списка (начиная с bplist...).

Любые идеи очень ценятся.

Заранее спасибо.


person reflog    schedule 12.03.2012    source источник
comment
Пробовали сравнивать фактические байты декодированного utf8 item.stringValue с байтами исходной строки метаданных, декодированной CP1251? Поскольку это не сработало для вас, они, вероятно, не будут одинаковыми, но, возможно, вы найдете подсказку.   -  person Danra    schedule 17.03.2012
comment
Работает ли это, если вы выполняете декодирование самостоятельно, получая значение элемента dataValue вместо stringValue и декодируя его с помощью [[NSString alloc] initWithData:encoding:]? Если это не сработает, можете ли вы добавить к этому вопросу строку мусора, чтобы мы могли разобраться, с какими кодировками она была искажена?   -  person davehayden    schedule 20.03.2012
comment
Нет, это не сработало для меня. Но я попытаюсь опубликовать шестнадцатеричные значения данных, которые я получаю из dataValue.   -  person reflog    schedule 20.03.2012


Ответы (4)


Быстрое решение 2.0:

let origTitleMeta: NSData = (<AVMetadataItem>.timedMetadata?.first?.stringValue?.dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: true))!

let convertedTitleMeta: String = String(data: origMeta, encoding: NSUTF8StringEncoding)!
person Mugurel    schedule 15.06.2016

Я закончил тем, что использовал NSPropertyListReader_binary1 Майка Эша и получил необработанные данные, а затем исказил их, чтобы NSString закодировал их.

Ужасно - но работало.

person reflog    schedule 20.03.2012
comment
А, интересно. Похоже ли, что это была просто ошибка в декодировании строки, или это как-то исказило данные? - person davehayden; 21.03.2012
comment
Дело в том, что внутри MP3 тег ID3 был закодирован в CP1251 (я проверял бинарный файл), но после его чтения с помощью AVAsset данные интерпретируются как UTF16, что приводит к искажению данных. Я использовал пользовательскую программу чтения plist, чтобы получить фактические данные и вручную их деформировать. - person reflog; 21.03.2012
comment
@reflog. Не могли бы вы опубликовать решение, которое вы нашли с помощью NSPropertyListReader_binary1, или быстро просмотреть мой вопрос (stackoverflow.com/questions/16001847/)? Я столкнулся с той же проблемой и потратил много времени, пытаясь ее решить. Заранее спасибо! - person NikGreen; 17.04.2013

У меня есть расширение 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)
    }
}
person Victor Do    schedule 10.02.2017

Быстрое решение 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)!
person nullproduction    schedule 07.02.2017