NSString 解码

NSString Decoding

我有一个情况,我不知道是什么原因造成的。

我从服务器得到了这样的字符串

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:@"\"];

以上代码也不行。

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

感谢您的帮助。

您需要使用 CFStringTransform 来转换非转义 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 and 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