2012-03-12 12 views
4

私はCP1251(キリル文字)でエンコードされたフィールドを持つAVMetadataItemを持っています。 item.stringValueを読み終えたら、ガベージ符号化された文字列を取得します。 私はその文字列を未加工のUTF8に変換してから、CP1251エンコーディングを使って新しい文字列を作成しようとしました。 item.dataValueを取ろうとしましたが、ダイスはなく、生のリストデータが入っています(bplist ...で始まる)。AVMetadataItemのエンコーディング

どのようなアイデアも非常に高く評価されています。

ありがとうございます。

+0

アイテムを復号化.stringValueは元のCP1251デコードされたメタデータ文字列のバイト数ですか?それはあなたのために働かなかったので、おそらく同じではありませんが、多分あなたはいくつかのヒントを見つけることができます。 – Danra

+0

自分でデコードすると、stringValueではなくitemValueを取得し、[[NSString alloc] initWithData:encoding:]でデコードすれば動作しますか?それができない場合は、この質問にガベージ文字列を追加して、エンコードされたエンコードを並べ替えることができますか? – davehayden

+0

いいえ、それは私のために働かなかった。しかし、私はdataValueから取得したデータの16進値を投稿しようとします。 – reflog

答えて

2

私はMike AshのNSPropertyListReader_binary1を使用してしまい、生データを取得してからそれをマングリングしてNSStringでエンコードするようにしました。

恐ろしいですが、働きました。

+0

ああ、面白い。それは文字列をデコードするのが間違っているように見えますか、それとも何とかデータをマングリングしていましたか? – davehayden

+0

MP3内部にはID3タグがCP1251でエンコードされていましたが(バイナリファイルをチェックしましたが)、AVAssetを使ってそれを読み取った後、データはUTF16として解釈され、データをマングリングします。私は実際のデータを取得し、それを手動で取り除くためにカスタムplistリーダーを使用しました。 – reflog

+0

@reflog - あなたはNSPropertyListReader_binary1を使って見つけた解決策を投稿してもらえますか、私の質問をすばやく見てください(http://stackoverflow.com/questions/16001847/correct-encoding-for-id3-tags-in-ios) )?私は同じ問題に直面し、それを解決しようと多くの時間を費やしました。前もって感謝します! – NikGreen

3

スイフト2.0溶液:

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

let convertedTitleMeta: String = String(data: origMeta, encoding: NSUTF8StringEncoding)! 
1

スイフト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)! 
2

IこのためAVMetadataItem拡張子を持っている:UTF8の実際のバイトに比較試み

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) 
    } 
}