NSNonLossyASCIIStringEncoding returns 无
NSNonLossyASCIIStringEncoding returns nil
我正在 iOS 中处理默认表情符号。我能够使用 NSNonLossyASCIIStringEncoding 编码成功编码和解码默认表情符号。
当我发送带有简单文本的表情符号时它工作正常但是当在字符串中添加一些特殊字符时它returns 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 编码将字符串转换为数据。这意味着它将根据使用的 unicode 字符转换 1-4 个字节的 unicode 字符。例如\ude09 将翻译成 ED B8 89。同样的解释可用 in wiki。基本上是使用以下技术:
现在,如果您尝试使用如下所示的 ascii 编码将其解码为字符串
NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];
以上肯定会失败,因为它无法将 ED B8 89 或类似的 unicode 数据解码为 ascii 字符串。这就是它 returns 错误的原因。
如果数据是 ascii 编码的,它会使用文字 ascii 十六进制进行转换。所以 \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?
对于表情符号,请尝试以下
testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?";
NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];
NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];
如果您只想在代码中将表情符号作为文字,有两种选择:
一个。就去做吧:
NSString *hello = @"+_)(&#&)#&)$&$)&$)^#%!!#$%!";
NSLog(@"%@", hello);
乙。将代码添加为 UTF32
NSString *hello = @"\U0001F600\U0001F60E+_)(&#&)#&)$&$)&$)^#%!!#$%!";
NSLog(@"%@", hello);
两种打印方式:+_)(&)#&)$&$)&$)^#%!!#$%!
我真的不明白你的问题。
我正在 iOS 中处理默认表情符号。我能够使用 NSNonLossyASCIIStringEncoding 编码成功编码和解码默认表情符号。
当我发送带有简单文本的表情符号时它工作正常但是当在字符串中添加一些特殊字符时它returns 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 编码将字符串转换为数据。这意味着它将根据使用的 unicode 字符转换 1-4 个字节的 unicode 字符。例如\ude09 将翻译成 ED B8 89。同样的解释可用 in wiki。基本上是使用以下技术:
现在,如果您尝试使用如下所示的 ascii 编码将其解码为字符串
NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];
以上肯定会失败,因为它无法将 ED B8 89 或类似的 unicode 数据解码为 ascii 字符串。这就是它 returns 错误的原因。
如果数据是 ascii 编码的,它会使用文字 ascii 十六进制进行转换。所以 \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?
对于表情符号,请尝试以下
testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?";
NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];
NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];
如果您只想在代码中将表情符号作为文字,有两种选择:
一个。就去做吧:
NSString *hello = @"+_)(&#&)#&)$&$)&$)^#%!!#$%!";
NSLog(@"%@", hello);
乙。将代码添加为 UTF32
NSString *hello = @"\U0001F600\U0001F60E+_)(&#&)#&)$&$)&$)^#%!!#$%!";
NSLog(@"%@", hello);
两种打印方式:+_)(&)#&)$&$)&$)^#%!!#$%!
我真的不明白你的问题。