messageField
的UITextView
,其中的数据以JSON格式POST
到服务器。当用户输入一个Emoji字符时,我遇到了编码数据到JSON
的问题。我认为Emoji使用Unicode编码。有没有一种方法将Emoji字符编码为JSON?并且从JSON返回Emoji以在
UILabel
中显示?messageField
的UITextView
,其中的数据以JSON格式POST
到服务器。当用户输入一个Emoji字符时,我遇到了编码数据到JSON
的问题。我认为Emoji使用Unicode编码。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使用一个统一的专用区为表情符号提供特定的代码点。将这些“字符”视为表情符号的唯一方法是拥有可用的表情符号字体以及知道如何从默认文本字体(例如Helvetica)切换到表情符号字体的机器。
我不知道您如何编码JSON,但是由于表情符号只是文本,因此只要以Unicode友好格式(例如UTF-8或UTF-16)传输文本,就不应该存在任何问题。您在服务器端或数据库中看不到它(除非使用先前的必备条件查看数据),但是您应该能够发送相同的原始字节并且它应该看起来相同。
以下是一些可能更有帮助的文章:
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上运行完美。
我曾经遇到同样的问题,查了几个小时,最终找到了这个对我有用的答案:https://dev59.com/hG435IYBdhLWcg3w7k6b#8339255
如果您正在使用Rails作为服务器,这就是您需要做的全部。无需在ios/xcode中进行任何UTF8/16编码操作,只需将NSString传递给服务器即可,Postegre会正确存储代码,只是当您将json响应发送回ios客户端时,假定您使用render json:@message,json编码会出现问题。
您可以通过在rails控制台中进行简单测试来测试是否存在json编码问题:
test = {"smiley"=>"u{1f604}"} test.to_json
如果它打印出"{\"smiley\":\"\uf604\"}"(请注意数字1丢失了),那么您就有这个问题,链接中的修补程序将解决它。
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
数据必须是JSON规范中列出的5种支持的编码之一:UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE。数据可能有BOM也可能没有。最有效的解析编码是UTF-8,因此如果您可以选择编码传递给此方法的数据,请使用UTF-8。
需要注意的一点是 Emoji - 如果您的JSON编码器设置为生成ASCII输出(即使用\u<4个十六进制数字>字符格式),某些Emoji字符将无法正常显示,因为它们使用超过两个字节,因此无法适应允许的4个十六进制数字。
所以在Python中,确保使用:
json.dumps(<object containing emoji strings>, ensure_ascii=False)