如何将表示表情符号的unicode字符替换为冒号分隔的字符串表情符号?

时间:2015-12-16 12:25:17

标签: java android string unicode character

我有一个JSON映射将所有unicode表情符号映射到它们的冒号分隔字符串表示(如twitter使用)。我已经将文件导入到Pair<的ArrayList中了。字符,字符串>现在需要扫描一个String消息,并用任意字符串替换任何unicode表情符号。

我的转换代码如下:

  public static String getStringFromUnicode(Context context, String m) {
    ArrayList<Pair<Character, String>> list = loadEmojis(context);
    String formattedString="";
    for (Pair p : list) {
       formattedString  = message.replaceAll(String.valueOf(p.first), ":" + p.second + ":");
    }
    return formattedString;
}

但是当我将消息发送到服务器时,我总是得到unicode表情符号表示。

非常感谢任何帮助,谢谢!!

1 个答案:

答案 0 :(得分:0)

如果有疑问,请回到第一原则。

你有很多东西都嵌套在一起。在这种情况下,我发现解决问题的最佳方法是将其分开并查看不同部分正在做什么。这使您可以控制问题,并将测试代码放在需要的位置,以查看数据的作用。

我最好的猜测是,replaceAll()的表现不可预测;误将表情符号字符串误解为正则表达式分析的命令。

我建议用你自己的循环代替replaceAll()做同样的事情。由于我们正在使用Unicode,我建议深入研究这个问题。这个小代码示例将执行与替换all相同的操作,但因为我在逐个字符的基础上处理字符串,所以无论字符串中有什么有趣的控件代码,它都应该有效。

String message = "This :-) is a test :-) message";
String find = ":-)";
String replace = "!";
int pos = 0;

//Replicates function of replaceAll without the regular expression analysis
pos = subPos(message,find);
while (pos != -1)
{
   String tmp = message.substring(0,pos);
   tmp = tmp + replace;
   tmp = tmp + message.substring(pos+find.length());
   message = tmp;
   pos = subPos(message,find);
 }
System.out.println(message);


-- Snip --

//Replicates function of indexOf
public static int subPos(String str, String sub)
{
   for (int i = 0; i < str.length() - (sub.length() - 1); i++)
   {
      int j;
      for (j = 0; j < sub.length(); j++)
      {
         System.out.println(i + j);
         if (str.charAt(i + j) != sub.charAt(j))
            break;
      }
      if (j == sub.length()) 
         return i;
   }
   return -1;
}

我希望这会有所帮助。 : - )