2011-08-24 19 views
10

Tengo un UITextView al que llamo messageField. Los datos dentro de ese messageField es POST -ed al servidor en formato JSON. Cuando el usuario escribe un carácter Emoji, tengo problemas para codificar los datos en JSON. Estoy pensando que Emoji usa la codificación Unicode.Los caracteres Emoji no se pueden codificar en JSON

¿Hay alguna forma de codificar un carácter Emoji en JSON? ¿Y de regreso de JSON a Emoji para mostrar en un UILabel?

+0

puedo cambiar emoji decodificación en ios que se codifica en el lado de php? Si es así, ¿cómo puedo hacer esto en ambos lados? Lo intento, pero no funcionan, solo codifican y decodifican el mismo tamaño. De lo contrario no funcionaba :(así que por favor dame alguna solución. Gracias en Advanced. – ilesh

Respuesta

10

Editar - 2016-03-03Tenga en cuenta que esta respuesta fue escrita en 2011 y ya no es relevante.

Los caracteres Emoji son solo una fuente específica utilizada para representar puntos de código Unicode específicos. iOS usa una de las áreas de uso privado de Unicode para puntos de código específicos de Emoji. La única forma de ver estos "personajes" como Emoji es tener una fuente de Emoji disponible, así como una máquina que sepa cómo pasar de la fuente de texto predeterminada (como Helvetica) a la fuente de emoji.

No sé cómo está codificando su JSON, pero dado que los Emoji son solo texto, no debería haber ningún problema siempre que transporte el texto en un formato compatible con Unicode como UTF-8 o UTF- dieciséis. No lo verá en el lado del servidor o en la base de datos (a menos que vea los datos con los requisitos previos anteriores), pero debería poder devolver los mismos bytes sin procesar y debería tener el mismo aspecto.

Aquí hay algunos puestos que podría ayudar un poco más:

+0

Hola, gracias por el comentario. Me ayudó mucho :) Mi único problema ahora es cuando publico los datos json en el servidor web, y trato de obtener los datos usando $ postData = file_get_contents ("php: // input"); No puedo obtener la información. Pero cuando uso datos ficticios como, $ postData = '{"body": "characters here "}'; Puedo insertar con éxito los datos en la base de datos y leerlos en el dispositivo. – janusbalatbat

+0

¿Puedo cambiar el decodificador de emoji en ios que está codificado en php side? Si es así, ¿cómo puedo hacer esto en ambos lados? Lo intento, pero no funcionan, solo codifican y decodifican el mismo tamaño. De lo contrario no funcionaba :(así que por favor dame alguna solución. Gracias en avanzado. – ilesh

+0

Este comentario realmente debería ser una pregunta –

1

Una cosa a tener en cuenta con Emoji - si se ha establecido su codificador JSON para producir una salida ASCII (es decir, usando el \ u 4 dígitos hexadecivos> formato de caracteres), algunos caracteres Emoji se romperán porque th Usan más de dos bytes y, por lo tanto, no caben en los 4 dígitos hexadecimales permitidos.

Así que en Python, por ejemplo, asegúrese de usar:

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

que tenían el mismo problema, después de cavar durante horas y finalmente encontró esta respuesta que funciona para mí: https://stackoverflow.com/a/8339255/1090945

Si están usando raíles como su servidor, esto es todo lo que necesita hacer. No es necesario hacer nada en ios/xcode, simplemente pase el NSString sin hacer ningún tipo de codificación UTF8/16 en el servidor.

Postegre almacena el código correctamente, es justo cuando envías la respuesta json a tu cliente ios, suponiendo que ejecutas json: @message, la codificación json tiene un problema.

usted podría probar si usted está teniendo problemas JSON codificación en la consola rieles haciendo prueba tan simple:

test = { "sonriente" => "u {1f604}"} prueba.a_json

si se imprime "{\" smiley \ ": \" \ uf604 \ "}" (nótese la 1 está perdido), entonces usted tiene este problema. y el parche del enlace lo arreglará.

+0

Muchas gracias. Ya estaba notando el que falta también. De todos modos, ese parche de mono funcionó para mí. Gracias ! –

28

que usar el siguiente código para codificar caracteres emoji

NSString *uniText = [NSString stringWithUTF8String:[textview.text UTF8String]]; 
NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding]; 
NSString *goodMsg = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding] ; 

Y el siguiente código para decodificar y mostrar en UILabel

const char *jsonString = [body UTF8String]; 
NSData *jsonData = [NSData dataWithBytes:jsonString length:strlen(jsonString)]; 
NSString *goodMsg = [[NSString alloc] initWithData:jsonData encoding:NSNonLossyASCIIStringEncoding]; 
+0

Sí, esto es ayuda para mí ... para enviar y recibir caracteres emoji a través de la notificación de inserción .... – Pradeep

+0

¿Puedo cambiar el decodificador de emoji en ios que está codificado en php side? Si es así, ¿cómo puedo hacer esto en ambos lados? .Lo intento, pero no funcionan, solo codifican y decodifican el mismo tamaño. De lo contrario no funciona :(así que por favor dame alguna solución. Gracias en Advanced. – ilesh

+0

@ilesh: Depende del tipo de codificación que está haciendo en el lado de PHP. – Karun

4

Gracias @Karu, la edición de su respuesta, utilizo este código:

Codificar para enviar al servidor:

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

NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding]; 

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

Decode para recibir y mostrar texto 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; 
} 

Este código ejecutar perfecta en IOS 9

1

actualización Swift & Objective C

Si desea enviar enviar un elemento emoji través de JSON, primero necesitas formatear DB a UTF-8 Y en IOS necesitas codificar para NSUTF8StringEncoding. Así que primero asegúrese de que su formato de base de datos para UTF-8 luego codifique los parámetros para NSUTF8StringEncoding.So aquí hay una solicitud de muestra al enviar el mensaje.

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 

Pero no es necesario para decodificar a NSUTF8StringEncoding en iOS.Because según la documentación de manzana que decodificar 5 codificaciones.

Los datos deben estar en una de las 5 codificaciones soportadas enumerados en la especificación JSON: UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE. Los datos pueden tener o no una lista de materiales. La codificación más eficiente para el análisis es UTF-8, por lo que si tiene la opción de codificar los datos pasados ​​ a este método, use UTF-8.

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

Cuestiones relacionadas