web-dev-qa-db-fra.com

comment encoder et décoder emoji dans Android?

J'ai utilisé https://github.com/rockerhieu/emojicon library dans mon application. Lorsque je passe une chaîne unicode statique dans mon code, emoji est visible, mais si j'envoie l'emoji au serveur php en utilisant un service Web régulier, puis retrive la chaîne, il affiche simplement la chaîne unicode dans mon application. les chaînes statiques et récupérées sur le serveur sont identiques si je compare.

Quelqu'un peut-il me dire quel tort j'ai commis dans ma candidature? la même application est développée dans IOS et ce qu'ils ont fait, c'est qu'ils ont d'abord encodé la chaîne en ASCII> UTF-8 lors de l'envoi au serveur . Ils ont ensuite décodé la chaîne de la même manière. Quelqu'un peut-il me suggérer si cela serait également compatible avec Android? Si oui, comment puis-je le faire?.

26
Vishnu

Nous pouvons utiliser la bibliothèque commons-lang (commons-lang-2.5.jar) pour coder et décoder les caractères unicode. Téléchargez le fichier jar ici ou utilisez gradle: compile 'org.Apache.commons:commons-lang3:3.4'.

Pour le codage, utilisez - StringEscapeUtils.escapeJava(String text) Ceci peut être utilisé dans Android EditText lorsque vous appelez la méthode getText, où elle codera correctement les caractères unicode avant son envoi au serveur Web.

Pour le décodage, utilisez - StringEscapeUtils.unescapeJava(String text) Ceci peut être utilisé dans Android TextView à setText, où il décodera correctement les caractères unicode après avoir reçu la réponse du serveur Web.


Ex:

EditText etEmojiEditText = new EditText(this);
etEmojiEditText.setText("TYPE SOMETHING IN EMOJI");

String toServer = etEmojiEditText.getText();
String toServerUnicodeEncoded = StringEscapeUtils.escapeJava(toServer);

String serverResponse = "SOME RESPONSE FROM SERVER WITH UNICODE CHARACTERS";
String fromServerUnicodeDecoded = StringEscapeUtils.unescapeJava(serverResponse);

FYI Utilisez également l'encodage et le décodage pour le service Web. La chaîne codée Unicode doit être décodée du service Web et la réponse du service Web doit être codée avant son envoi aux clients. Les tables Server doivent contenir utf8mb4 au lieu de utf8, car le caractère unicode nécessite 4 octets par caractère. Par conséquent, l'unicode ne sera pas représenté en 3 octets.

J'ai utilisé la même bibliothèque que vous pour emoji . J'ai utilisé URLEncoder.encode (commentString, "UTF-8") pour le codage et, de manière similaire, URLDecoder.decode (encodedComment, "UTF-8") pour décodage.

Fonctionne parfaitement pour moi. J'espère pour vous aussi.

11
Neeraj Shukla

Vous pouvez encoder et décoder des émoticônes sans utiliser aucune bibliothèque dans Android si vous recevez unicode de votre serveur.

Exemple :

U+1F601 is 16 bit unicode.

Remplacez U+ par 0x.

  int originalUnicode=0x1F601;
  textView.setText(getEmoticon(originalUnicode));


  public String getEmoticon(int originalUnicode) {
    return new String(Character.toChars(originalUnicode));
}
1
Gowtham Kumar

J'utilise la même bibliothèque ... Vous n'avez pas besoin de coder ni d'échapper à l'emoji ... simplement getText (). ToString () fonctionnera.

Suis les étapes

Dans mysql, remplacez le classement du champ par utf8mb4_unicode_ci (le classement de ma base de données et de ma table est utf8_unicode_ci).

PHP a utilisé Codigniter sur le serveur pour la configuration de la base de données 

'char_set' => 'utf8mb4',
'dbcollat' => 'utf8mb4_unicode_ci'

Ensuite, dans Android, utilisez textView.getText().toString();, puis envoyez le texte sans utiliser d’encodage ni d’échappement.

1
Sabeer Mohammed

Emojis doit être encodé et décodé. Vous devez envoyer le texte au serveur par codage et le montrer à nouveau dans la variable app en le décodant. Le code est ci-dessous pour le cryptage et le décryptage.

public static String encodeEmoji (String message) {
try {
return URLEncoder.encode(message,
"UTF-8");
} catch (UnsupportedEncodingException e) {
return message;
}
}


public static String decodeEmoji (String message) {
String myString= null;
try {
return URLDecoder.decode(
message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return message;
}
} 
0
parambir singh

Dans mon cas, tout le texte dans le message disparaît après les symboles & et +, j'ai donc décidé de les remplacer avant l'envoi et après la réception.

private String encodeMessage(String message) {
    message = message.replaceAll("&", ":and:");
    message = message.replaceAll("\\+", ":plus:");
    return StringEscapeUtils.escapeJava(message);
}

private String decodeMessage(String message) {
    message = message.replaceAll(":and:", "&");
    message = message.replaceAll(":plus:", "+");
    return StringEscapeUtils.unescapeJava(message);
}

Convertissez unicode en emoji dans tout le contenu sans utiliser aucune bibliothèque.

private String convertEmoji(String content) {
    content = content.replaceAll("U\\+", "0x");
    String keyword = "0x";

    int index = content.indexOf(keyword);
    int spaceIndex;

    while (index >=0){
        spaceIndex = content.indexOf(" ", index);

        if(spaceIndex > index) {
            String emoji = content.substring(index, spaceIndex);
            content = content.replaceAll(emoji, getEmoticon(Integer.decode(emoji)));
        }
        index = content.indexOf(keyword, index+keyword.length());
    }

    return content;
}
0
Melih Toksari