从Android中的editText编码和解码表情符号

时间:2017-08-16 07:38:58

标签: android

我正在尝试在EditText字段中使用表情符号。但问题是,当我尝试将表情符号转换为六进制时,该值不正确。

我正在使用此函数在Hexa中获取表情符号值。

public static String escapeJavaString(String st){
    StringBuilder builder = new StringBuilder();
    try {
        for (int i = 0; i < st.length(); i++) {
            char c = st.charAt(i);
            if(!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c)&& !Character.isWhitespace(c) ){
                String hexa= String.valueOf(c);
                int code = (int)c;
                if(!(code >= 0 && code <= 255)){
                    hexa= "0x"+Integer.toHexString(c);
                }
                builder.append(unicode);
            }
            else{
                builder.append(c);
            }
        }
        Log.i(TAG, builder.toString());
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return builder.toString();
}

我试图添加笑脸,它给了我价值0xd83d这在以下功能中无效。

以下是将Hexa值转换为表情符号的功能,此功能正常工作我尝试提供手动Hexa值。

        // 0xd83d this value is get from above function but not work
        // in this function 
        //String hexaCode = "0xd83d"; // not work
        String hexaCode = "0x1F60A"; // work
        int emoji= Integer.parseInt(hexaCode.substring(2), 16);
        reurn new String(Character.toChars(emoji));
你能告诉我我做错了什么吗?请不要将我推荐给任何表情符号库。

3 个答案:

答案 0 :(得分:2)

我解决了,这对我来说很好。
这是代码。

public String escapeJavaString(String st){
    int ss1 = 0,ss2;
    Boolean high = true;
    StringBuilder builder = new StringBuilder();
    try {
        for (int i = 0; i < st.length(); i++) {
            char c = st.charAt(i);
            if(!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c)&& !Character.isWhitespace(c) ){
                String unicode = String.valueOf(c);
                int code = (int)c;
                if(!(code >= 0 && code <= 255)){
                    unicode = Integer.toHexString(c);
                    if(high){
                        high = false;
                        ss1 = Integer.parseInt(unicode, 16);
                    }else{
                        high = true;
                        ss2 = Integer.parseInt(unicode, 16);
                        char chars = Character.toChars(ss1)[0];
                        char chars2 = Character.toChars(ss2)[0];
                        int codepoint = Character.toCodePoint(chars, chars2);
                        unicode = "Ax" + codepoint;
                        builder.append(unicode);
                    }
                }
            }
            else{
                builder.append(c);
            }
        }
        Log.i(TAG, builder.toString());
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return builder.toString();
}

对于解码使用此。

    int emoji= Integer.parseInt(hexaCode.substring(2));
    reurn new String(Character.toChars(emoji));

答案 1 :(得分:0)

escapeJavaString(String st)方法中,您获得了unicode。您无法在开始时添加0x将其转换为codePonit。看看https://github.com/uber/react-vis/blob/master/showcase/sunbursts/sunburst-with-tooltips.js,希望找到一个关键

答案 2 :(得分:0)

String str = edText.getText().toString();
String unicodeStr = StringEscapeUtils.escapeJava(str);

您可以使用commons-lang-2.5 jar

从表情符号中获取Unicode

如果要获取索引或十六进制值,则首先需要将字符串解析为HTML字符

StringEscapeUtils.escapeHtml()

或使用emoji4j库。

例如:

String line = "Hi , i am fine \uD83D\uDE02 \uD83D\uDE02, how r u ?";
EmojiUtils.hexHtmlify(line); //Hi , i am fine &#x1f602; &#x1f602;, how r u ?

此处1f602是您的十六进制代码。

System.out.println(Character.toChars(Integer.parseInt("1f602",16)));