NSNonLossyASCIIStringEncoding返回nil

时间:2017-02-03 09:47:26

标签: ios objective-c unicode encoding emoji

我正在开发iOS中的默认表情符号。我能够使用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

2 个答案:

答案 0 :(得分:6)

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

 testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\";
 NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];

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

enter image description here

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

   NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 

以上一定会失败,因为它无法将ED B8 89或类似的unicode数据解码为ascii string。这就是它返回错误的原因。

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

所以正确的转换是:

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

您的问题是为什么要将其编码为UTF8并解码为ASCII?

对于表情符号,请尝试以下

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

答案 1 :(得分:1)

如果您只想将代码中的表情符号作为文字,有两种选择:

一个。就这么做:

NSString *hello = @"+_)(&#&)#&)$&$)&$)^#%!!#$%!";
NSLog(@"%@", hello);

B中。将代码添加为UTF32

NSString *hello = @"\U0001F600\U0001F60E+_)(&#&)#&)$&$)&$)^#%!!#$%!";
NSLog(@"%@", hello);

两个版画:+ _)(&amp;#&amp;)#&amp;)$&amp; $)&amp; $)^#%!!#$%!

我真的不明白你的问题。