【问题标题】:Emoji characters cannot be encoded to JSON表情符号字符无法编码为 JSON
【发布时间】:2011-11-02 22:00:29
【问题描述】:

我有一个UITextView,我称之为messageFieldmessageField 中的数据是 POST-ed 到服务器的 JSON 格式。当用户键入表情符号字符时,我无法将数据编码为JSON。我在想 Emoji 使用 Unicode 编码。

有没有办法将 Emoji 字符编码为 JSON?然后从 JSON 返回到 Emoji 以显示在 UILabel?

【问题讨论】:

  • 我可以在 ios 中更改 php 端编码的解码表情符号吗?如果是的话,我怎么能在双方都这样做。我尝试但没有工作只编码和解码相同的大小。否则无法正常工作:(所以请给我一些解决方案。感谢高级。

标签: ios json character-encoding emoji


【解决方案1】:

编辑 - 2016-03-03 请注意,此答案写于 2011 年,可能不再相关。

表情符号字符只是用于呈现特定 unicode 代码点的特定字体。 iOS 将 Unicode 专用区域之一用于表情符号特定的代码点。将这些“字符”视为 Emoji 的唯一方法是拥有可用的 Emoji 字体以及知道如何从默认文本字体(例如 Helvetica)切换到 emoji 字体的机器。

我不知道您是如何对 JSON 进行编码的,但由于 Emoji 只是文本,因此只要您以 Unicode 友好格式(例如 UTF-8 或 UTF-16)传输文本就不会有任何问题.您不会在服务器端或数据库中看到它(除非您使用之前的先决条件查看数据),但您应该能够发回相同的原始字节,并且看起来应该相同。

这里有一些帖子可能会有所帮助:

【讨论】:

  • 嗨。感谢您的评论。它帮助很大:) 我现在唯一的问题是当我将 json 数据发布到网络服务器时,并尝试使用 $postData = file_get_contents("php://input");我无法获取数据。但是当我使用虚拟数据时, $postData = '{"body":"characters here "}';我可以成功地将数据插入数据库并在设备中读取它们。
【解决方案2】:

使用 Emoji 需要注意的一件事 - 如果您的 json 编码器设置为生成 ASCII 输出(即使用 \u 字符格式),一些 Emoji 字符会因为使用两个以上字节而中断,并且因此不适合允许的 4 个十六进制数字。

所以以python为例,一定要使用:

json.dumps(<object containing emoji strings>, ensure_ascii=False)

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,经过几个小时的挖掘,终于找到了适合我的答案: https://stackoverflow.com/a/8339255/1090945

    如果您使用 rails 作为您的服务器,这就是您需要做的所有事情。无需在 ios/xcode 中执行任何操作,只需将 NSString 传递给服务器,无需执行任何 UTF8/16 编码。

    Postegre 正确存储代码,只是当您将 json 响应发送回 ios 客户端时,假设您渲染 json:@message,json 编码有问题。

    你可以通过简单的测试来测试你的rails控制台中是否有json编码问题:

    测试 = {"笑脸"=>"u{1f604}"} test.to_json

    如果它打印出 "{\"smiley\":\"\uf604\"}" (注意 1 丢失了),那么你有这个问题。链接中的补丁将修复它。

    【讨论】:

    • 非常感谢。是的,我也注意到了丢失的一个。诡异的。无论如何,那个猴子补丁对我有用。谢谢!
    【解决方案4】:

    我使用下面的代码来编码表情符号

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

    以及下面的代码在 UILabel 中解码和显示

    const char *jsonString = [body UTF8String]; 
    NSData *jsonData = [NSData dataWithBytes:jsonString length:strlen(jsonString)]; 
    NSString *goodMsg = [[NSString alloc] initWithData:jsonData encoding:NSNonLossyASCIIStringEncoding];
    

    【讨论】:

    • 是的,这对我有帮助......通过推送通知发送和接收表情符号......
    • 我可以在 ios 中更改 php 端编码的解码表情符号吗?如果是的话,我怎么能在双方都这样做。我尝试但没有工作只编码和解码相同的大小。否则无法正常工作:(所以请给我一些解决方案。感谢高级。
    • @ilesh :这取决于您在 PHP 端执行的编码类型。
    【解决方案5】:

    感谢@Karu,编辑您的回复,我使用此代码:

    发送到服务器的编码:

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

    解码以接收和显示表情符号文本:

    NSData *newdata = [received_string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    
    NSString *mystring = [[NSString alloc] initWithData:newdata encoding:NSNonLossyASCIIStringEncoding];
    
    NSString *finalString= @"";
    
    if (mystring) {
       finalString = mystring;
    }else{
       finalString = received_string;
    }
    

    这段代码在 iOS 9 上完美运行

    【讨论】:

      【解决方案6】:

      更新 Swift 和 Objective C

      如果您想通过 JSON 发送表情符号项目,首先您需要将 DB 格式化为 UTF-8,并且在 IOS 中您需要为 NSUTF8StringEncoding 进行编码。因此,首先确保您的数据库格式为 UTF-8,然后将参数编码为 NSUTF8StringEncoding。所以这里是发送消息时的示例请求。

          let post:NSString = parameters!
          let url:NSURL = NSURL(string: serverURL!)!
          let postData:NSData = post.dataUsingEncoding(NSUTF8StringEncoding)! // Change Here
          let postLength:NSString = String( postData.length )
          let request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
          request.HTTPMethod = "POST"
          request.HTTPBody = postData
          request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
          request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
          request.setValue("*/*", forHTTPHeaderField: "Accept")
          return request
      

      但您不需要在 iOS 中解码为 NSUTF8StringEncoding。因为根据苹果文档,它可以解码 5 种编码。

      数据必须采用列表中列出的 5 种支持的编码之一 JSON 规范:UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE。这 数据可能有也可能没有 BOM。最有效的编码用于 解析是 UTF-8,所以如果您可以选择对传递的数据进行编码 对于这种方法,请使用 UTF-8。

      https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSJSONSerialization_Class/#//apple_ref/occ/clm/NSJSONSerialization/JSONObjectWithData:options:error:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2017-10-28
        • 1970-01-01
        相关资源
        最近更新 更多