Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何更改NSString';什么是编码?_Cocoa_Encoding_Nsstring - Fatal编程技术网

Cocoa 如何更改NSString';什么是编码?

Cocoa 如何更改NSString';什么是编码?,cocoa,encoding,nsstring,Cocoa,Encoding,Nsstring,我有一个NString数组,我在打印数组时从NSLog得到了这个。 以下是我实现的代码: NSMetadataQuery *query = [[NSMetadataQuery alloc] init]; ..... NSArray *queryResults = [[query results] copy]; for (NSMetadataItem *item in queryResults) { id value = [item valueForAttribute: kMDItemA

我有一个NString数组,我在打印数组时从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",

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

这些字符串是utf-8编码的。您可以通过以下方式对其进行解码:

NSString *myDecoded = [NSString stringWithUTF8String:myEscapedString];
因此,要处理完整的数组“completeArray”,可以先将其转换为常量字符*,然后再转换回NSString:

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

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

回顾一下
description
(例如,
\U0308
)所做的转义,字符串是错误的(例如,“äúÀäÍÖ-Ó”)因为您得到的数据是错误的

这可能不是聚光灯的错。(您可以通过尝试不同的ID3标记库来验证这一点。)最可能的情况是,文件本身包含编码错误的标记

要解决此问题,请执行以下操作:

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

  • 如果第2步在任何尝试中成功,这就是您的有效数据(除非您非常不走运)。如果所有尝试都失败,则数据不可恢复,您可能希望警告用户其输入文件包含虚假标记。

    它不起作用。'stringWithUTF8String:'应采用(const char*)参数,而不是NSString,对吗?我认为这可能涉及字符串编码检测。“
    ascienceoding
    ”不存在,尝试将UTF-8编码为“ASCII”可能不起作用;您需要使用一种包含字符串中所有字符的编码(特别是输入文件写入时最初使用的编码)。对NSData进行编码和解码也比创建然后读取C字符串更有效。如何获取这些字符串?它们的原始字节表示形式是什么?如何将它们转换为
    NSString
    对象?我已经在主主题中发布了代码。关于步骤1,我仍然不知道如何对其进行编码。能否提供一些代码片段?非常感谢。@Li Fumin::我花了几个小时尝试了“CFStringEncodingExt.h”中包含的大部分编码,但仍然找不到恢复字符串的正确编码<代码>NSData*数据=[item dataUsingEncoding:CFStringConvertEncodingTonsStringCodeing(kCFStringEncodingISOLatin2)];NSString*decodeString=[[NSString alloc]initWithData:数据编码:NSUTF8StringEncoding]自动释放];NSLog(@“%@=>%@”,项,解码字符串)@Li Fumin:别忘了先试试内置的
    NSStringEncoding
    值。如果这些都不起作用,字符串可能已经被破坏不止一次,找到正确的编码组合来恢复原始代码几乎是不可能的。只是找到一些有用的东西,可能有点过时,但仍然有用。