我有一个情况,我不知道是什么导致它。
我从服务器那里得到了一个字符串
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函数,见下文
所以我决定更换额外的" \"使用以下代码从输入字符串
inputString=[inputString stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];
以上代码也不起作用。
我的问题是 - >我究竟做错了什么?它是如何工作的?
感谢帮助。
答案 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