Эмодзи символы не могут быть закодированы в JSON - PullRequest
12 голосов
/ 24 августа 2011

У меня есть UITextView, который я называю messageField.Данные в этом messageField POST передаются на сервер в формате JSON.Когда пользователь вводит символ Emoji, у меня возникают проблемы при кодировании данных в JSON.Я думаю, что Emoji использует кодировку Unicode.

Есть ли способ кодировать символ Emoji в JSON?И обратно из JSON в Emoji для отображения в UILabel?

Ответы [ 6 ]

28 голосов
/ 11 ноября 2013

Я использую приведенный ниже код для кодирования символа эмодзи

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];
10 голосов
/ 24 августа 2011

Редактировать - 2016-03-03 Обратите внимание, этот ответ был написан в 2011 году и может больше не иметь значения.

Символы эмодзи простоопределенный шрифт, используемый для визуализации определенных кодовых точек юникода.iOS использует одну из областей частного использования Unicode для кодовых точек, характерных для Emoji.Единственный способ увидеть эти «символы» как Emoji - это иметь доступный шрифт Emoji, а также компьютер, который знает, как переключиться со шрифта текста по умолчанию (такого как Helvetica) на шрифт emoji.

IНе знаю, как вы кодируете свой JSON, но поскольку эмодзи - это просто текст, проблем не должно быть, если вы транспортируете текст в формате, удобном для Unicode, например UTF-8 или UTF-16.Вы не увидите его на стороне сервера или в базе данных (если только вы не просматриваете данные с предыдущими предварительными условиями), но вы должны быть в состоянии отправить те же необработанные байты обратно, и они должны выглядеть одинаково.

Вот некоторые посты, которые могут помочь немного больше:

4 голосов
/ 28 января 2016

Спасибо @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

4 голосов
/ 04 июня 2012

У меня была такая же проблема, после нескольких часов копания и, наконец, я нашел ответ, который работает для меня: https://stackoverflow.com/a/8339255/1090945

Если вы используете rails в качестве сервера, это все, что вам нужно сделать.Не нужно ничего делать в ios / xcode, просто передайте NSString, не выполняя какие-либо операции кодирования UTF8 / 16, на сервер.

Postegre правильно хранит код, просто когда вы отправляете ответ json обратно в ваш клиент ios, при условии, что вы выполняете рендеринг json: @message, возникает проблема с кодировкой json.

Вы можете проверить, есть ли у вас проблемы с кодировкой json в вашей консоли rails, выполнив простой тест:

test = {"smiley" => "u {1f604} "} test.to_json

, если он печатает" {\ "smiley \": \ "\ uf604 \"} "(обратите внимание, что 1 потеряно), тогда у вас есть этопроблема.и патч по ссылке это исправит.

2 голосов
/ 31 мая 2012

С Emoji следует помнить одну вещь - если ваш кодировщик json настроен на вывод ASCII (т. Е. С использованием формата символов \ u <4 hex digits>), некоторые символы Emoji будут прерываться, поскольку они используют более двух байтов и таким образом, не вписывается в 4 разрешенных шестнадцатеричных числа.

Так, например, в python обязательно используйте:

json.dumps(<object containing emoji strings>, ensure_ascii=False)
1 голос
/ 28 апреля 2016

Обновление 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

Но вам не нужно декодировать в NSUTF8StringEncoding в iOS. Так как согласно документации Apple, он декодирует 5 кодировок.

Данные должны быть в одном из5 поддерживаемых кодировок, перечисленных в спецификации JSON: UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE.Данные могут иметь или не иметь спецификацию.Наиболее эффективное кодирование для анализа - UTF-8, поэтому, если у вас есть выбор в кодировании данных, передаваемых этому методу, используйте UTF-8.

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

...