NSString解码

时间:2018-04-17 07:01:15

标签: ios objective-c encoding nsstringencoding

我有一个情况,我不知道是什么导致它。

我从服务器那里得到了一个字符串

NSString *str=@"\\u3060\\u3044\\u3053\\u3093\\u3001\\u5927\\u6839\\n";

我正在尝试使用以下代码解码它。

NSLog(@"%@",[self decodeString:str]);


-(NSString*)decodeString:(NSString *)inputString{
    NSData *utfStringData=[inputString dataUsingEncoding:NSUTF8StringEncoding];
    NSString *output=[[NSString alloc] initWithData:utfStringData encoding:NSNonLossyASCIIStringEncoding];
    return output;
}

我输出 nil

但是当我删除额外的" \"从输入字符串开始,NSString本身显示正确的措辞,甚至没有传入decodeString函数,见下文

enter image description here

所以我决定更换额外的" \"使用以下代码从输入字符串

inputString=[inputString stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];

以上代码也不起作用。

我的问题是 - >我究竟做错了什么?它是如何工作的?

感谢帮助。

1 个答案:

答案 0 :(得分:2)

您需要使用CFStringTransform转换unescape unicode字符。 CFStringTransform可以像希腊语和拉丁语(或任何已知的脚本)之间的音译一样发挥真正的魔力,但它也可以用来做一些平凡的任务,比如从服务器中取消字符串:

NSString *str=@"\\u3060\\u3044\\u3053\\u3093\\u3001\\u5927\\u6839\\n";
NSString *convertedString = [str mutableCopy];

CFStringRef transform = CFSTR("Any-Hex/Java");
CFStringTransform((__bridge CFMutableStringRef)convertedString, NULL, transform, YES);
NSLog(@"convertedString: %@", convertedString);     //convertedString: だいこん、大根\n

CFStringTransform非常强大。它支持许多预定义的转换,例如大小写映射,规范化或unicode字符名称转换。您甚至可以设计自己的转换。

OS X 10.11和iOS 9将以下方法添加到Foundation:

- (nullable NSString *)stringByApplyingTransform:(NSString *)transform reverse:(BOOL)reverse;

以下是使用上述方法的代码:

NSString *convertedString = [str stringByApplyingTransform:@"Any-Hex/Java" reverse:YES];
NSLog(@"convertedString: %@", convertedString);     //convertedString: だいこん、大根\n