2011-08-24 6 views
10

J'ai un UITextView que j'appelle messageField. Les données au sein de cette messageField est POST -ed au serveur au format JSON. Lorsque l'utilisateur tape un caractère Emoji, j'ai de la difficulté à encoder les données en JSON. Je pense qu'Emoji utilise l'encodage Unicode.Les caractères Emoji ne peuvent pas être codés en JSON

Existe-t-il un moyen d'encoder un caractère Emoji en JSON? Et de retour de JSON à Emoji pour afficher dans un UILabel?

+0

Puis-je changer decode emoji dans ios qui est codé dans le côté php? Si oui, comment puis-je faire cela des deux côtés. j'essaye mais ne fonctionnant seulement seulement encoder et décoder la même taille. Sinon ne fonctionne pas :(alors s'il vous plaît donnez-moi une solution Merci à l'avance – ilesh

Répondre

10

Edition - 03/03/2016S'il vous plaît noter, cette réponse a été écrit en 2011 et ne peut plus être plus pertinent.

Les caractères emoji sont juste une police spécifique utilisée pour rendre des points de code Unicode spécifiques. iOS utilise l'une des zones d'utilisation privée Unicode pour les points de code spécifiques à Emoji. La seule façon de voir ces "caractères" comme Emoji est d'avoir une police Emoji disponible ainsi qu'une machine qui sait comment passer de la police de texte par défaut (comme Helvetica) à la police emoji. Je ne sais pas comment vous coder votre JSON mais comme les Emoji ne sont que du texte, il ne devrait pas y avoir de problèmes tant que vous transportez le texte dans un format Unicode-friendly tel que UTF-8 ou UTF-UTF-8 ou UTF-8. 16 Vous ne le verrez pas sur le serveur ou dans la base de données (sauf si vous affichez les données avec les conditions préalables précédentes), mais vous devriez être en mesure d'envoyer les mêmes octets bruts et il devrait être identique.

Voici quelques messages qui pourraient aider un peu plus:

+0

Salut, merci pour le commentaire.Il m'a beaucoup aidé :) Mon seul problème est maintenant quand je POST les données json sur le serveur web, et essayez d'obtenir les données utilisant $ postData = file_get_contents ("php: // input"); Je ne peux pas obtenir les données. Mais quand j'utilise des données factices comme, $ postData = '{"body": "caractères ici "}'; Je peux insérer avec succès les données dans la base de données et les lire dans l'appareil. – janusbalatbat

+0

Puis-je changer de décoder emoji dans ios qui est codé en PHP côté? Si oui, comment puis-je faire cela des deux côtés. j'essaye mais ne fonctionnant seulement seulement encoder et décoder la même taille. Sinon ne fonctionne pas :(alors s'il vous plaît donnez-moi une solution.Merci dans Avancé – ilesh

+0

Ce commentaire devrait vraiment être une question –

1

Une chose à prendre en compte avec Emoji - si votre encodeur JSON est réglé pour produire une sortie ASCII (c'est-à-dire en utilisant le format de caractères 4 chiffres hexadécimaux), certains caractères Emoji Ils utilisent plus de deux octets et ne rentrent donc pas dans les 4 chiffres hexadécimaux autorisés.

Donc, en python par exemple, assurez-vous d'utiliser:

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

J'ai eu le même problème, après avoir creusé pendant des heures et a finalement trouvé cette réponse qui fonctionne pour moi: https://stackoverflow.com/a/8339255/1090945

Si vous utilisez des rails comme serveur, c'est tout ce que vous devez faire. Inutile de faire quoi que ce soit dans ios/xcode, il suffit de passer le NSString sans faire de codage UTF8/16 sur le serveur. Postegre stocke le code correctement, c'est juste quand vous envoyez la réponse json à votre client ios, en supposant que vous rendiez json: @ message, le codage json a un problème.

vous pouvez vérifier si vous avez problème d'encodage JSON dans votre console de rails en faisant comme simple test:

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

si elle imprime "{\" smiley \ ": \" \ uf604 \ "}" (notez le 1 est perdu), alors vous avez ce problème. et le patch du lien va le réparer.

+0

Merci beaucoup.J'ai remarqué le manquant aussi.Windird.En tout cas, ce patch de singe a travaillé pour moi. ! –

28

J'utilise le code ci-dessous pour encoder le caractère emoji

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

Et le code ci-dessous pour décoder et afficher dans UILabel

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

Oui c'est de l'aide pour moi ... pour l'envoi et la réception de caractères emoji par notification push .... – Pradeep

+0

Puis-je changer de décodage emoji dans ios qui est codé en PHP côté? Si oui que comment puis-je faire cela dans les deux côtés .j'essaye mais ne fonctionnant seulement seulement encoder et décoder la même taille. Sinon, ne fonctionne pas :(alors s'il vous plaît donnez-moi une solution.Merci dans avancé – ilesh

+0

@ilesh: Cela dépend du type de codage que vous faites sur le côté PHP – Karun

4

Merci @Karu, l'édition de votre réponse, j'utilise ce code:

Encode pour envoyer au serveur:

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

NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding]; 

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

Decode pour recevoir et montrer le texte 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; 
} 

Ce code fonctionner parfaitement sur iOS 9

1

mise à jour Swift & Objectif C

Si vous souhaitez envoyer envoyer un élément emoji par JSON, vous devez d'abord formater DB à UTF-8 et dans IOS vous devez encoder pour NSUTF8StringEncoding. Donc d'abord assurez-vous que votre DB se formate en UTF-8, puis encodez les paramètres en NSUTF8StringEncoding.So voici un exemple de requête lors de l'envoi du message.

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 

Mais vous n'avez pas besoin de décoder à NSUTF8StringEncoding en iOS.Because selon la documentation de la pomme, il décode 5 encodages.

Les données doivent être dans l'un des 5 codages pris en charge répertoriés dans la spécification JSON: UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE. Les données peuvent ou non avoir une nomenclature. L'encodage le plus efficace à utiliser pour l'analyse est UTF-8, donc si vous avez le choix d'encoder les données transmises à cette méthode, utilisez UTF-8.

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

Questions connexes