代码之家  ›  专栏  ›  技术社区  ›  iphonic

NSString解码

  •  1
  • iphonic  · 技术社区  · 6 年前

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

    我从服务器上得到了这样一个字符串

    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;
    }
    

    我明白了 作为输出。

    但是,当我从输入字符串中删除额外的“\”时,NSString本身显示了正确的措辞,甚至没有传递到decodeString函数中,请参见下文

    enter image description here

    因此,我决定使用以下代码替换输入字符串中的额外“\”

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

    上述代码也不起作用。

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

    谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Arnab    6 年前

    您需要使用 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