gpt4 book ai didi

ios - NSNonLossyASCIIStringEncoding 返回 nil

转载 作者:技术小花猫 更新时间:2023-10-29 11:04:35 47 4
gpt4 key购买 nike

我正在研究 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

最佳答案

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

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

此处您已使用 UTF8 编码将字符串转换为数据。这意味着它将根据使用的 unicode 字符转换 1-4 个字节的 unicode 字符。例如\ude09 将翻译成 ED B8 89。同样的解释可用 in wiki .基本上是使用以下技术:

enter image description here

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

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

上面的代码肯定会失败,因为它无法将 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];

问题是为什么要编码为 UTF8 并解码为 ASCII?


对于表情符号,请尝试以下

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

关于ios - NSNonLossyASCIIStringEncoding 返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42021291/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com