14

我有一个UITextView我称之为messageField. 其中的数据messageFieldPOSTJSON 格式发送到服务器。当用户键入表情符号字符时,我无法将数据编码为JSON. 我在想表情符号使用 Unicode 编码。

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

4

6 回答 6

28

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

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];
于 2013-11-11T11:33:12.450 回答
11

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

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

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

以下是一些可能会有所帮助的帖子:

于 2011-08-24T19:10:21.713 回答
4

在挖掘了几个小时后,我遇到了同样的问题,终于找到了适合我的答案: 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 丢失了),那么你有这个问题。链接中的补丁将修复它。

于 2012-06-04T00:03:00.147 回答
4

感谢@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 上完美运行

于 2016-01-28T08:00:01.997 回答
2

使用 Emoji 需要注意的一件事 - 如果您的 json 编码器设置为生成 ASCII 输出(即使用 \u<4 hex digits> 字符格式),一些 Emoji 字符会中断,因为它们使用超过两个字节,因此不会t 符合允许的 4 个十六进制数字。

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

json.dumps(<object containing emoji strings>, ensure_ascii=False)
于 2012-05-31T13:49:22.323 回答
2

更新 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 种编码。

数据必须采用 JSON 规范中列出的 5 种支持的编码之一: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

于 2016-04-28T11:42:35.397 回答