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)
问题是由于您用于编码和解码的编码不同.
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)
| 归档时间: |
|
| 查看次数: |
758 次 |
| 最近记录: |