NSNonLossyASCIIStringEncoding返回nil [英] NSNonLossyASCIIStringEncoding returns nil

查看:482
本文介绍了NSNonLossyASCIIStringEncoding返回nil的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在iOS中使用默认的emojis。我可以使用NSNonLossyASCIIStringEncoding编码成功编码和解码默认的emojis。



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



代码

  testString = :; Hello \\\�\\\�\\\�\\\�。," /?\; 
NSData * data = [testString dataUsingEncoding:NSUTF8StringEncoding];
NSString * strBody = [[NSString alloc] initWithData:数据编码:NSNonLossyASCIIStringEncoding];
//这里strBody是nil


解决方案

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

  testString =:; Hello \\\�\\\�\\\�\\\�。,& \; 
NSData * data = [testString dataUsingEncoding:NSUTF8StringEncoding];

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



< img src =https://i.stack.imgur.com/u0KPw.pngalt =在此输入图像说明>



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

  NSString * strBody = [[NSString alloc] initWithData:数据编码: NSNonLossyASCIIStringEncoding]; 

以上内容一定会失败,因为它无法解码ED B8 89或类似的unicode数据到ascii字符串。这就是为什么它返回一个错误。



如果数据是ascii编码的,它将使用文字ascii hex进行转换。所以\\\�会变成5c 75 64 65 30 39



所以正确的转换将是:

  testString =:; Hello \\\�\\\�\\\�\\\�。,<> /?\; 
NSData * data = [testString dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString * strBody = [[NSString alloc] initWithData:数据编码:NSNonLossyASCIIStringEncoding];

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






对于emojis,请尝试以下

  testString =:; Hello \\\\�\\\\�\\\\�\\\\�。,< / / 
NSData * data = [testString dataUsingEncoding:NSUTF8StringEncoding];
NSString * strBody = [[NSString alloc] initWithData:数据编码:NSNonLossyASCIIStringEncoding];


I'm working on default emojis in iOS. i'm able to successfully encode and decode default emojis using NSNonLossyASCIIStringEncoding encoding.

Its working fine when i sent emojis with simple text but it returns nil when some special character is added in string. How do i make it work ?

Code :

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

解决方案

The problem is due to different encodings you have used for encoding and decoding.

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

Here you have converted a string to data using UTF8 encoding. This means it will convert the unicode characters in 1-4 bytes depending on the unicode character used. for e.g. \ude09 will translate to ED B8 89. The explanation of the same is available in wiki. Basically is uses the following technique:

Now if you try to decode this to string using ascii encoding like below

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

The above is bound to fail as it cannot decode ED B8 89 or similar unicode data to ascii string. That's why it returns an error.

If the data was ascii encoded, it would have used literal ascii hex for the conversion. So \ude09 would have become "5c 75 64 65 30 39"

So the correct conversion would be :

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

The question for you is why you want it to encode as UTF8 and decode as ASCII?


For emojis, please try the below

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

这篇关于NSNonLossyASCIIStringEncoding返回nil的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆