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ć.
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.
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ż.
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
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));
}
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);
}
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;
}
}
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