如何更改NSString的编码?

时间:2011-09-16 08:26:29

标签: cocoa encoding nsstring

我有NStrings的NSArray,我在打印数组时从NSLog得到了这个。 这是我实施的代码:

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",

现在我如何将人类不可读的字符串更改为人类可读的字符串?感谢。

3 个答案:

答案 0 :(得分:2)

回顾description完成的转义(例如\U0308),字符串是错误的(例如,“Öйú°®ÀÖÀÖÍÅ-Óà”),因为你得到的数据是错误的。< / p>

可能不是Spotlight的错。 (您可以通过尝试使用不同的ID3标记库来验证。)很可能,文件本身包含编码不良的标记。

解决此问题:

  1. 将其编码为与字符匹配的8位编码。你不能随意选择一个编码(比如“ASCII”,Cocoa在我最后一次检查时映射到ISO Latin 1);您需要使用包含输入中的所有字符的编码,并且正确编码它们,以便您接下来要执行的操作。按顺序尝试ISO Latin 1,ISO Latin 9,Windows codepage 1252和MacRoman。
  2. 将编码数据解码为UTF-8。如果失败,请返回步骤1并尝试不同的编码。
  3. 如果第2步尝试成功,那么这就是您的有效数据(除非您非常不走运)。如果所有尝试都失败,则数据无法恢复,您可能需要警告用户他们的输入文件包含伪造标记。

答案 1 :(得分:1)

这些字符串是utf-8编码的。您可以通过以下方式解码它们:

NSString *myDecoded = [NSString stringWithUTF8String:myEscapedString];

因此,要处理完整数组'completeArray',您可以先转换为const char *然后再转换为NSString:

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

答案 2 :(得分:1)

解析这些字符串并不是特别容易:请参阅this SO post了解背景信息。它有其他SO帖子的链接,具有处理此问题的具体方法。