表情符号字符无法编码为JSON
我有一个UITextView
,我称之为messageField
。 该messageField
的数据以JSON格式POST
到服务器。 当用户键入表情符号时,我无法将数据编码为JSON
。 我在想Emoji使用Unicode编码。
有没有办法将表情符号编码为JSON? 从JSON回到Emoji以显示在UILabel
?
编辑 – 2016-03-03 请注意,这个答案是在2011年写的,可能不再相关。
表情符号字符只是用于呈现特定unicode代码点的特定字体。 iOS使用其中一个Unicode专用区域来表示特定于表情符号的代码点。 将这些“字符”视为表情符号的唯一方法是使用表情符号字体,以及知道如何从默认文本字体(如Helvetica)切换到表情符号字体的机器。
我不知道你是如何对你的JSON进行编码的,但是因为表情符号只是文本,所以只要你以Unicode友好的格式(如UTF-8或UTF-16)传输文本就不应该有任何问题。 您不会在服务器端或数据库中看到它(除非您查看具有先前先决条件的数据),但您应该能够返回相同的原始字节,它应该看起来相同。
这里有一些post可能会有所帮助:
- 绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!)
- 关于iPhone表情符号和网页的问题
- iPhone表情符号
我使用下面的代码来编码表情符号字符
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];
我有同样的问题,经过几个小时的挖掘,终于找到了适合我的答案: https : //stackoverflow.com/a/8339255/1090945
如果您使用rails作为服务器,则只需执行此操作即可。 无需在ios / xcode中执行任何操作,只需传递NSString而不对服务器执行任何UTF8 / 16编码。
Postegre正确存储代码,就在你将json响应发送回你的ios客户端时,假设你渲染了json:@message,json编码有问题。
您可以通过简单的测试来测试您的rails控制台中是否存在json编码问题:
test = {“smiley”=>“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上运行完美
用表情符号注意一件事 – 如果你的json编码器被设置为产生ASCII输出(即使用\ u <4十六进制数字>字符格式),一些表情符号字符将因为它们使用超过两个字节而中断t适合允许的4个hex数字。
所以在python中,例如,一定要使用:
json.dumps(
更新Swift和Objective C
如果你想通过JSON发送表情符号项,首先你需要将数据库格式化为UTF-8并且在IOS中你需要编码NSUTF8StringEncoding。 因此,首先确保您的数据库合并为UTF-8然后将参数编码为NSUTF8StringEncoding.So这是发送消息时的示例请求。
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。