如何在android中编码和解码表情符号?

时间:2014-08-01 06:25:40

标签: android emoji

我在我的应用程序中使用了https://github.com/rockerhieu/emojicon库。当我在我的代码中传递静态unicode字符串时,表情符号是可见的,但是如果我使用常规的get webservice将表情符号发送到php服务器并检索字符串,那么它只是将unicode字符串显示到我的应用程序中。如果我进行比较,静态和服务器检索的字符串都是相同的。

有人能告诉我在申请中做了什么错。在IOS中开发了相同的应用程序,他们所做的是在发送到服务器时首先将字符串编码为ASCII> UTF-8。 然后他们以与发送时相同的方式解码字符串。任何人都可以建议我,如果这也与android兼容,如果是,那我该怎么做呢。

8 个答案:

答案 0 :(得分:61)

我们可以使用commons-lang(commons-lang-2.5.jar)库来编码和解码unicode字符。下载jar文件here或使用gradle:compile 'org.apache.commons:commons-lang3:3.4'

使用编码 - StringEscapeUtils.escapeJava(String text) 这可以在调用EditText方法时在android getText中使用,它将在发送到Web服务器之前正确编码unicode字符。

用于解码使用 - StringEscapeUtils.unescapeJava(String text) 这可以在android TextViewsetText中使用,它会在收到来自Web服务器的响应后正确解码unicode字符。


实施例

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 也可以使用Web服务端的编码和解码。 Unicode编码的字符串应该从Web服务解码,Web服务的响应应该在发送给客户端之前进行编码。 服务器表应包含utf8mb4而不是utf8,因为unicode字符每个字符需要4bytes。因此,unicode不会以3字节表示。

答案 1 :(得分:11)

我使用了与你相同的库来表情符号。 我使用URLEncoder.encode(commentString,“UTF-8”)进行编码,同样地, 用于解码的URLDecoder.decode(encodedComment,“UTF-8”)。

完美适合我。希望也适合你。

答案 2 :(得分:1)

我正在使用相同的库...你不需要编码或转义表情符号...只需getText()。toString()就可以了。

按照步骤

在mysql中将字段排序规则更改为utf8mb4_unicode_ci(我的数据库和表排序规则为utf8_unicode_ci)

在服务器上使用PHP Codigniter进行数据库配置

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

然后在Android中使用textView.getText().toString();然后发送文本而不使用任何编码或转义

答案 3 :(得分:1)

  

您可以在不使用任何库的情况下编码和解码表情符号   如果您从服务器接收unicode,则为android。

示例:

U+1F601 is 16 bit unicode.

U+替换为0x

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


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

答案 4 :(得分:0)

在我的情况下,消息中的所有文字都会在符号&之后消失。和+,所以我决定在发送之前和收到之后更换它们,这对我很有用。

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);
}

答案 5 :(得分:0)

Emojis需要进行编码和解码。您应该通过编码将文本发送到服务器,然后通过对其进行解码再次显示在app中。下面的代码用于加密和解密。

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;
}
} 

答案 6 :(得分:0)

在不使用任何库的情况下将Unicode转换为全部内容中的表情符号。

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;
}

答案 7 :(得分:0)

  // convert UTF-8 to internal Java String format
    public static String convertUTF8ToString(String s) {
        String out = null;
        out = new String(s.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
        return out;
    }

    // convert internal Java String format to UTF-8
    public static String convertStringToUTF8(String s) {
       return new String(s.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
    }