【问题标题】:NSString with emoticons/emojis url encode带有表情符号/表情符号的 NSString url 编码
【发布时间】:2023-03-04 17:03:01
【问题描述】:

我正在尝试获取可能包含特殊字符和表情符号的 UITextField 的内容,并将其转换为可以在 GET 请求中传递给 PHP 服务的内容。

如果我根本不对字符串进行编码,表情符号会显示得很好(我可以在数据库中看到它们并且它们会正确地返回给我)......但是如果我添加特殊字符(~!@#$ % 等)GET 请求阻塞。

所以我通过 url 编码器运行字符串:

[commentText stringByAddingPercentEscapesUsingEncoding:NSNonLossyASCIIStringEncoding];

我正在使用 NSNonLossyASCIIStringEncoding 来正确获取表情符号,这很有效,但是使用它进行编码会返回一个 nil 字符串。事实上,唯一不返回 nil 的编码是 UTF8,但它会使用百分比转义符组合 emoji unicode。

我该怎么做?我是否必须为这种情况编写自己的字符串替换,或者是否有一种我没有看到的 iOS 方法?

干杯,

克里斯

【问题讨论】:

  • NSNonLossyASCIIStringEncoding 显然 不起作用 如果它返回 nil。至于NSUTF8StringEncoding,“...用百分比转义符来处理 emoji unicode。”这正是百分比转义符的作用。你期望发生什么?
  • 我需要一些东西来保持完整的 unicode 位完整,同时逃避会阻止 GET 请求通过的东西。 UTF8 在表情符号的 unicode 中获取和转义字符,使其无法使用。对于这三个表情符号 (????????????) UTF8 编码将它们变成 (%F0%9F%98%84%F0%9F%98%98%F0%9F%98%B3)。
  • 使用 NonLossyASCII 编码使它们保持完整。
  • 除非它不能保持它们完好无损,因为将NSNonLossyASCIIStringEncoding 传递给stringByAddingPercentEscapesUsingEncoding: 返回 nil,如您所说。那是因为字符串不是 ASCII。
  • 好的...那么解决方案是什么?让表情符号通过中间件成功传输到数据库的唯一方法是根本不对其进行编码。但这仅在传递的字符串不包含任何特殊字符时才有效。似乎随着 iOS 7 对表情符号采用 Unicode 6 规范,没有框架函数可以同时处理扩展字符和 url 编码。我基本上是在问是否真的有一个,我只是没有找到它,或者我是否需要自己推出(我最终这样做只是为了继续前进)。

标签: ios objective-c encoding nsstring urlencode


【解决方案1】:

使用它来转义表情符号:

NSString *escapedEmoji = [NSString stringWithCString:[emojiString cStringUsingEncoding:NSNonLossyASCIIStringEncoding] encoding:NSUTF8StringEncoding];

这是为了取消表情符号:

NSString *unescapedEmoji = [NSString stringWithCString:[escapedString cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding];

【讨论】:

  • 您的示例代码完美运行。我必须将聊天消息编码为 ASCII 字符串发送。
  • 我在聊天应用程序中使用这种编码。在我的情况下,这适用于(iOS 到 iOS 消息),但它从(iOS 到 android)添加了一些额外的 unicode 字符。这种情况我该怎么办。
【解决方案2】:

NSNonLossyASCIIStringEncodingstringByAddingPercentEscapesUsingEncoding: 返回 nil,因为您传入的字符串不是 ASCII。使用NSUTF8StringEncoding percent 会转义表情符号字符,这就是我所期望的结果。如果您的服务器端中间件没有自动从查询字符串中取消转义表情符号,那么如果它导致上游出现问题,您应该在服务器端代码中执行此操作。

【讨论】:

  • 那是票。在输出时通过 UTF8 进行编码,在填充到数据库之前提供中间件不转义。然而,奇怪的是,除非我使用 NSNonLossyASCIIStringEncoding 解码生成的 JSON,否则我会得到垃圾。 NonLossy 给了我真正的表情符号。不知道为什么,但这对我有用。
【解决方案3】:

您可以使用以下代码对表情符号字符串进行编码

NSString *uniText = [NSString stringWithUTF8String:[youremojistring UTF8String]];
NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString *goodMsg = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding];

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2017-10-28
    • 2016-12-11
    • 2014-03-27
    相关资源
    最近更新 更多