NSNonLossyASCIIStringEncoding返回nil

aqs*_*had 10 unicode encoding objective-c ios emoji

我正在iOS中使用默认的emojis.我能够使用NSNonLossyASCIIStringEncoding编码成功编码和解码默认表情符号.

当我用简单的文本发送表情符号时它工作正常,但是当在字符串中添加一些特殊字符时它返回nil.我如何使它工作?

代码:

    testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\";
    NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];
    NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 
    // here strBody is nil
Run Code Online (Sandbox Code Playgroud)

man*_*shg 6

问题是由于您用于编码和解码的编码不同.

 testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\";
 NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

在这里,您已使用UTF8编码将字符串转换为数据.这意味着它将根据所使用的unicode字符转换1-4个字节的unicode字符.例如\ ude09将转换为ED B8 89. 维基可以获得相同的解释.基本上是使用以下技术:

在此输入图像描述

现在,如果您尝试使用ascii编码将此解码为字符串,如下所示

   NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 
Run Code Online (Sandbox Code Playgroud)

上述情况必定会失败,因为它无法将ED B8 89或类似的unicode数据解码为ascii字符串.这就是它返回错误的原因.

如果数据是ascii编码的,那么它将使用文字ascii hex进行转换.所以\ ude09会成为"5c 75 64 65 30 39"

所以正确的转换将是:

    testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\";
    NSData *data = [testString dataUsingEncoding:NSNonLossyASCIIStringEncoding];
    NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 
Run Code Online (Sandbox Code Playgroud)

你的问题是为什么你希望它编码为UTF8并解码为ASCII?


对于表情符号,请尝试下面的内容

        testString=":;Hello \\ud83d\\ude09\\ud83d\\ude00 ., <> /?";
        NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];
        NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 
Run Code Online (Sandbox Code Playgroud)