【问题标题】:How to change an NSString's encoding?如何更改 NSString 编码?
【发布时间】:2011-09-16 08:26:29
【问题描述】:

我有一个 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",

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

【问题讨论】:

  • 如何获取这些字符串?它们的原始字节表示形式是什么,如何将它们转换为NSString 对象?
  • 我已经把代码贴在主题里了。

标签: cocoa encoding nsstring


【解决方案1】:

查看description(例如\U0308)完成的转义,字符串是错误的(例如,“Öйú°®ÀÖÀÖÍÅ-Óà¡”),因为您获得的数据是错误的。

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

解决这个问题:

  1. 以匹配字符的 8 位编码对其进行编码。你不能随便选择一个编码(比如我上次检查时 Cocoa 映射到 ISO Latin 1 的“ASCII”);您需要使用包含输入中所有字符的编码 并且 正确地对它们进行编码,以便您接下来要做的事情。按顺序尝试 ISO Latin 1、ISO Latin 9、Windows 代码页 1252 和 MacRoman。
  2. 将编码数据解码为 UTF-8。如果失败,请返回第 1 步并尝试其他编码。

如果第 2 步的任何尝试都成功了,那么这就是您的有效数据(除非您非常不走运)。如果所有尝试都失败,则数据不可恢复,您可能需要警告用户他们的输入文件包含虚假标签。

【讨论】:

  • 关于第1步,我仍然不知道如何编码。你能提供一些代码sn-ps吗?非常感谢。
  • 我花了好几个小时来尝试“CFStringEncodingExt.h”中包含的大部分编码,但仍然找不到正确的编码来恢复字符串。 NSData *data = [item dataUsingEncoding: CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatin2)]; NSString *decodeString = [[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] autorelease]; NSLog(@"%@ ==> %@",item, decodeString);
  • @李福民:别忘了先试试内置的NSStringEncoding值。如果这些都不起作用,则该字符串可能已多次损坏,并且几乎不可能找到正确的编码组合来恢复原始字符串。
  • 刚刚发现一些有用的东西,可能有点过时了,但仍然有用。How to detect string encoding
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这些字符串是 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]]];
    }
    

    【讨论】:

    • 它不起作用。'stringWithUTF8String:' 应该采用 (const char*) 参数,而不是 NSString ,对吗?我认为这可能涉及字符串编码检测。
    • ASCIIEncoding” 不存在,尝试将 UTF-8 编码为“ASCII”可能行不通;您需要使用包含字符串中所有字符的编码(特别是在写入输入文件时最初使用的编码)。对 NSData 进行编码和解码也更有效,而不是创建然后读取 C 字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多