我正在开发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
答案 0 :(得分:6)
问题是由于您用于编码和解码的编码不同。
testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\";
NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];
您已使用UTF8编码将字符串转换为数据。这意味着它将根据所使用的unicode字符转换1-4个字节的unicode字符。例如\ ude09将转换为ED B8 89.相同的解释可用in wiki。基本上是使用以下技术:
现在,如果您尝试使用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; $)^#%!!#$%!
我真的不明白你的问题。