2011-09-16 5 views
4

私はNStringのNSArrayを持っています、私はNSLogから配列を印刷するときにこれを持っています。NSStringのエンコーディングを変更するには?

NSMetadataQuery *query = [[NSMetadataQuery alloc] init]; 
..... 
NSArray *queryResults = [[query results] copy]; 

for (NSMetadataItem *item in queryResults) 
{ 
    id value = [item valueForAttribute: kMDItemAlbum]; 
    [databaseArray addObject: value]; 
} 

"The Chronicles Of Narnia: Prince Caspian", 
"Taste the First Love", 
"Once (Original Soundtrack)", 
"430 West Presents Detroit Calling", 
"O\U0308\U00d0\U00b9u\U0301\U00b0\U00aeA\U0300O\U0308A\U0300O\U0308I\U0301A\U030a-O\U0301a\U0300A\U0302\U00a1", 
"\U7ea2\U96e8\U6d41\U884c\U7f51", 
"I\U0300\U00ab\U00bc\U00abO\U0303A\U030aE\U0300y\U0301\U00b7a\U0301", 
"A\U0303n\U0303\U00b8e\U0300\U00b2I\U0300C\U0327U\U0300", 
"\U00bb\U00b3A\U0308i\U0302O\U0303\U00bdO\U0301N\U0303", 
"American IV (The Man Comes Aro", 
"All That We Needed", 

が今どのように私は人間が読める文字列に人間が判読できない文字列を変更することができます:ここに は、私が実装したコードのですか?ありがとう。

+0

これらの文字列はどのように入手できますか?オリジナルのバイト表現は何ですか?それらを 'NSString'オブジェクトにどのように変換しますか? –

+0

メイントピックにコードを掲載しました。 –

答えて

2

description(例えば、\U0308)によって行わエスケープを過ぎてみると、文字列が(例えば、「Öйú°®ÀÖÀÖÍÅ-Óà¡」)間違っています。

これは、であり、おそらくで、Spotlightの欠陥ではありません。 (別のID3タグライブラリを試して確認できます)おそらく、ファイル自体にエンコードされていないタグが含まれている可能性があります。文字に一致する8ビットのエンコーディングでそれをエンコードし

  1. :この問題を解決するには

    。最後にチェックしたときにISO Latin 1にマップされた "ASCII"のようなエンコーディングをランダムに選ぶことはできません。入力内のすべての文字を含むエンコーディングを使用する必要があります。は、次に行うことを正しくエンコードします。 ISO Latin 1、ISO Latin 9、Windows codepage 1252、MacRomanの順に試してください。

  2. エンコードされたデータをUTF-8としてデコードします。これが失敗する場合は、手順1に戻り、別のエンコードを試してください。

ステップ2が成功すると、それはあなたの有効なデータです(あなたが非常に不運な場合を除きます)。すべての試行で失敗した場合、データは回復不可能であり、入力ファイルに偽のタグが含まれていることをユーザーに警告する必要があります。

+0

手順1について、私はまだこれをコード化する方法を理解できません。いくつかのコードスニペットを提供してください。どうもありがとう。 –

+0

@ Li Fumin:http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instm/NSString/dataUsingEncoding: –

+0

私は 'CFStringEncodingExt.h'に含まれるほとんどのエンコーディングを試してみたが、文字列を復元するための適切なエンコーディングを見つけることができなかった。 NSData * data = [itemDataUsingEncoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatin2)]; \t \t \t \t \t \t \t \t \t \t \t \t NSStringの* decodeString = [[[NSStringのALLOC] initWithData:データ・エンコーディング:NSUTF8StringEncoding]自動解放]。 \t \t \t \t \t \t \t \t \t \t \t \tのNSLog(@ "%@ ==>%の@"、アイテム、decodeString); ' –

1

これらの文字列はutf-8でエンコードされています。文字列のこれらの種類が上がらないの解析

NSMutableArray *processed = [NSMutableArray arrayWithCapacity:completeArray.count]; 
for (NSString* s in completeArray) { 
    [processed addObject:[NSString stringWithUTF8String:[s cStringUsingEncoding:ASCIIEncoding]]]; 
} 
+2

これは働いていません。「stringWithUTF8String:」はNSStringではなく(const char *)引数をとる必要がありますか?私はこれが文字列エンコーディングの検出を含むかもしれないと思う。 –

+0

良い点!私は例を変更しました。 – cellcortex

+0

"ASCIIEncoding'"が存在せず、UTF-8を "ASCII"としてエンコードしようとすると動作しない可能性があります。文字列内のすべての文字(具体的には、入力ファイルが書き込まれたときに最初にエンコードされたエンコード)を含むエンコードを使用する必要があります。 Cの文字列を作成して読み込むのではなく、NSDataをエンコードしてデコードする方が効率的です。 –

1

:だからあなたの完全な配列「completeArray」あなたはNSStringのに戻っ*最初に、その後のconst char型に変換することができますを処理するために

NSString *myDecoded = [NSString stringWithUTF8String:myEscapedString]; 

:あなたがすることによって、それらをデコードすることができます特に簡単:バックグラウンドについてはthis SO postを参照してください。この問題を処理する具体的な方法を持つ他のSO投稿へのリンクがあります。あなたが得たデータが間違っていたので、