jak kodować i dekodować emoji w Androidzie?

Użyłem https://github.com/rockerhieu/emojicon biblioteka w mojej aplikacji. Kiedy przekazuję statyczny ciąg unicode w moim kodzie emoji jest widoczny, ale jeśli wysyłam emoji na serwer php za pomocą regularnej usługi get webservice i pobieram ciąg, to po prostu wyświetla ciąg unicode w mojej aplikacji. zarówno stringi statyczne, jak i pobrane z serwera są takie same, jeśli porównam.

Czy ktoś może mi powiedzieć, co złego zrobiłem w moim zgłoszeniu? ta sama aplikacja jest rozwijana w IOS i co zrobili to najpierw zakodowali łańcuch do ASCII > UTF-8 podczas wysyłania na serwer. następnie dekodują łańcuch w taki sam sposób, jak wysyłają. Czy ktoś może mi zasugerować, czy byłoby to zgodne z Androidem również, jeśli tak, to jak Mogę to zrobić.

Author: Vishnu, 2014-08-01

6 answers

Możemy użyć commons-lang (commons-lang-2.5.jar) biblioteka do kodowania i dekodowania znaków unicode. Pobierz plik jar tutaj lub użyj gradle: compile 'org.apache.commons:commons-lang3:3.4'.

Do kodowania - StringEscapeUtils.escapeJava(String text) Można to wykorzystać w metodzie android EditText when call getText, gdzie poprawnie zakoduje znaki unicode przed wysłaniem na serwer WWW.

Do dekodowania użyj - StringEscapeUtils.unescapeJava(String text) Może być używany w Androidzie TextView do setText, gdzie będzie dekodował znaki unicode poprawnie po otrzymaniu odpowiedzi z serwera www.


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 użyj kodowania i dekodowania również po stronie usług internetowych. Zakodowany w Unicode ciąg znaków powinien być dekodowany z usługi sieciowej, a odpowiedź z usługi sieciowej powinna być zakodowana przed wysłaniem do klientów. tabele serwera powinny zawierać utf8mb4 zamiast utf8, ponieważ znak unicode potrzebuje 4bajtów na znak. Dlatego unicode nie będzie reprezentowany w 3bajtach.

 53
Author: Dulan Anuradha Bandara Dissana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-08 10:03:12

Użyłem tej samej biblioteki co ty do Emotikon. Użyłem Urlencodera.encode (commentString, "UTF-8") do kodowania i podobnie, URLDecoder.decode (encodedComment, "UTF-8") do dekodowania.

Działa idealnie dla mnie. Mam nadzieję, że dla ciebie też.

 11
Author: Neeraj Shukla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-28 20:31:36

Używam tej samej biblioteki ... Nie musisz kodować ani uciekać od Emoji ... po prostu getText ().ToString () zadziała.

Postępuj zgodnie z instrukcjami

W mysql Zmień kolacje pól na utf8mb4_unicode_ci (moja kolacja bazy danych i tabeli to utf8_unicode_ci)

Używane PHP Codigniter na serwerze więc konfiguracja bazy danych

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

Następnie w Androidzie użyj textView.getText().toString(); następnie wyślij tekst bez użycia kodowania lub ucieczki

 1
Author: Sabeer Mohammed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-29 11:31:46

Możesz kodować i dekodować emotikony bez użycia bibliotek w android, Jeśli otrzymujesz unicode z serwera .

Przykład:

U+1F601 is 16 bit unicode.

Zastąp U+ przez 0x.

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


  public String getEmoticon(int originalUnicode) {
    return new String(Character.toChars(originalUnicode));
}
 1
Author: Gowtham Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-24 09:06:00

W moim przypadku cały tekst w wiadomości znika po symbolach & i +, więc postanowiłem je zastąpić przed wysłaniem i po otrzymaniu i działa dobrze dla mnie.

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);
}
 0
Author: Денис Шовгеня,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-08 11:18:17

Emojis musi być zakodowany i dekodowany . Należy wysłać tekst do serwera przez kodowanie i pokazać ponownie w app dekodując to samo. Kod znajduje się poniżej dla szyfrowania i deszyfrowania.

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
Author: parambir singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-06 12:57:56