将UTF8十六进制字符串转换为常规UTF8编码的NSString

时间:2013-05-27 09:55:48

标签: iphone ios objective-c utf-8 nsstring

我从服务器返回UTF-8(十六进制):Hc3b8rt而不是字符串“Hørt”。 我需要将此响应转换为常规UTF-8。

我尝试过:

NSString *string = [dict objectForKey:@"suggest"];

const char *cfilename=[string UTF8String];

NSString *str = [NSString stringWithUTF8String:cfilename];

感谢您的时间!

4 个答案:

答案 0 :(得分:1)

使用字符串编码,NSISOLatin1StringEncoding

 - (id)initWithCString:(const char *)nullTerminatedCString 
              encoding:(NSStringEncoding)encoding

或者很快,

NSString *str = [NSString stringWithCString:cfilename 
                                   encoding:NSISOLatin1StringEncoding];

评论后编辑:

这有点奇怪。你的评论后我做了一些实验,发现了一些奇怪的行为。

- (void) testStringEncodingOK {
    NSString *string = @"h\u00c3\u00a5r";
    const char *cfilename=[string cStringUsingEncoding:NSISOLatin1StringEncoding];
    NSString *cs = [NSString stringWithUTF8String:cfilename];
    NSLog(@"String: %@", cs);
}

此输出:hår

但是如果你在资本中获得\ U,而不是\ u,那么我将它们替换为\ u。然后它没有用。似乎,

- (void) testStringEncodingConfused {
    NSString *string = @"h\\U00c3\\U00a5r";
    string = [string stringByReplacingOccurrencesOfString:@"\\U" withString:@"\\u"];
NSLog(@"Original string:%@", string); // now string = @"h\u00c3\u00a5r"
    const char *cfilename=[string cStringUsingEncoding:NSISOLatin1StringEncoding];
    NSString *cs = [NSString stringWithUTF8String:cfilename];
    NSLog(@"String: %@", cs);
}

输出是,h \ u00c5 \ u00a5r

答案 1 :(得分:1)

你无法解码这个。正如@JoachimIsaksson在上面的评论中所说,你如何判断“abba”究竟是“abba”还是两个unicode字符?

答案 2 :(得分:0)

使用以下代码..

  const char *ch = [yourstring cStringUsingEncoding:NSISOLatin1StringEncoding];

  yourstring = [[NSString alloc]initWithCString:ch encoding:NSUTF8StringEncoding];

   NSLog(@"%@",yourstring);

让我知道它的工作与否......

快乐编码......

答案 3 :(得分:0)

使用此代码

NSString *string = [dict objectForKey:@"suggest"];

const char *cfilename=[string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

NSString *str = [NSString stringWithUTF8String:cfilename];

告诉它是否有效。