我有一个UITextView
我称之为messageField
. 其中的数据messageField
以POST
JSON 格式发送到服务器。当用户键入表情符号字符时,我无法将数据编码为JSON
. 我在想表情符号使用 Unicode 编码。
有没有办法将表情符号字符编码为 JSON?然后从 JSON 返回到 Emoji 以显示在UILabel
?
我有一个UITextView
我称之为messageField
. 其中的数据messageField
以POST
JSON 格式发送到服务器。当用户键入表情符号字符时,我无法将数据编码为JSON
. 我在想表情符号使用 Unicode 编码。
有没有办法将表情符号字符编码为 JSON?然后从 JSON 返回到 Emoji 以显示在UILabel
?
我使用下面的代码来编码表情符号
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];
编辑 - 2016-03-03 请注意,这个答案写于 2011 年,可能不再相关。
表情符号字符只是用于呈现特定 unicode 代码点的特定字体。iOS 将 Unicode Private Use Areas 之一用于表情符号特定的代码点。将这些“字符”视为 Emoji 的唯一方法是拥有可用的 Emoji 字体以及知道如何从默认文本字体(例如 Helvetica)切换到 emoji 字体的机器。
我不知道您是如何对 JSON 进行编码的,但由于表情符号只是文本,因此只要您以 UTF-8 或 UTF-16 等 Unicode 友好格式传输文本,就不会有任何问题。您不会在服务器端或数据库中看到它(除非您使用之前的先决条件查看数据),但您应该能够发送回相同的原始字节,并且看起来应该相同。
以下是一些可能会有所帮助的帖子:
在挖掘了几个小时后,我遇到了同样的问题,终于找到了适合我的答案: 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 丢失了),那么你有这个问题。链接中的补丁将修复它。
感谢@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 上完美运行
使用 Emoji 需要注意的一件事 - 如果您的 json 编码器设置为生成 ASCII 输出(即使用 \u<4 hex digits> 字符格式),一些 Emoji 字符会中断,因为它们使用超过两个字节,因此不会t 符合允许的 4 个十六进制数字。
所以以python为例,一定要使用:
json.dumps(<object containing emoji strings>, ensure_ascii=False)
更新 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。