Символы Emoji не могут быть закодированы JSON

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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];

Ответ 3

У меня была та же проблема, после того, как выкопали часами и, наконец, нашли этот ответ, который работает для меня: fooobar.com/questions/192750/...

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

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

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

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

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

Ответ 4

Спасибо @Karu, отредактировав ваш ответ, я использую этот код:

Кодировать для отправки на сервер:

NSString *uniText = [NSString stringWithUTF8String:[text_to_send UTF8String]];

NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding];

NSString *str = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding];

Декодировать для приема и отображения текста emoji:

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

Ответ 5

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

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

json.dumps(<object containing emoji strings>, ensure_ascii=False)

Ответ 6

Обновить скорость и цель C

Если вы хотите отправить отправку элемента emoji через JSON, сначала вам нужно сформировать БД для UTF-8 И в IOS вам нужно закодировать для NSUTF8StringEncoding. Поэтому сначала убедитесь, что ваш DB формируется в 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.Because, согласно документации на 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: