NSNonLossyASCIIStringEncoding返回nil

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

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

代码

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

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

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

在这里,您已经使用UTF8编码将string转换为数据。 这意味着它将根据所使用的Unicode字符转换1-4个字节的Unicode字符。 例如\ ude09将翻译成ED B8 89.相同的解释可在wiki中find 。 基本上是使用以下技术:

在这里输入图像说明

现在,如果你尝试解码这个string使用ascii编码如下

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

由于无法将ED B8 89或类似的Unicode数据解码为ASCIIstring,因此上述注定会失败。 这就是为什么它返回一个错误。

如果数据是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]; 

你的问题是为什么你想要它作为UTF8编码和解码为ASCII?


emojis,请尝试下面的

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

如果你只是想在你的代码中使用表情符号,有两种select:

A.只要做到这一点:

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

B.将代码添加为UTF32

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

这两个打印:😀😎+ _)(&#&)#&)$&$)&$)^#%!!#$%!

我真的不明白你的问题。