Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将表示表情符号的unicode字符替换为冒号分隔的字符串表情符号?_Java_Android_String_Unicode_Character - Fatal编程技术网

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

Java 如何将表示表情符号的unicode字符替换为冒号分隔的字符串表情符号?,java,android,string,unicode,character,Java,Android,String,Unicode,Character,我有一个JSON将所有unicode表情映射到它们的冒号分隔字符串表示形式(就像twitter使用的那样)。我已经将该文件导入到Pair的ArrayList中,现在需要扫描一条字符串消息,并用其字符串等价物替换任何unicode表情符号 我的转换代码如下所示: public static String getStringFromUnicode(Context context, String m) { ArrayList<Pair<Character, String>

我有一个JSON将所有unicode表情映射到它们的冒号分隔字符串表示形式(就像twitter使用的那样)。我已经将该文件导入到Pair的ArrayList中,现在需要扫描一条字符串消息,并用其字符串等价物替换任何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;
}
公共静态字符串getStringFromUnicode(上下文,字符串m){
ArrayList list=loadEmojis(上下文);
字符串formattedString=“”;
用于(p对:列表){
formattedString=message.replaceAll(String.valueOf(p.first),“:”+p.second+“:”;
}
返回格式化字符串;
}
但是当我将消息发送到服务器时,我总是得到unicode表情符号表示


任何帮助都将不胜感激,谢谢

当有疑问时,回到第一原则

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

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

我建议将replaceAll()替换为您自己的循环,该循环也会执行相同的操作。由于我们正在使用Unicode,我建议深入研究这一点。这个小代码示例将执行与“全部替换”相同的操作,但因为我是在逐个字符的基础上对字符串进行寻址,所以无论字符串中有什么有趣的控件代码,它都应该可以工作

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;
}
String message=“This:-)是测试:-)消息”;
字符串find=“:-)”;
字符串替换=“!”;
int pos=0;
//在不进行正则表达式分析的情况下复制replaceAll的函数
pos=子pos(消息、查找);
而(位置!=-1)
{
字符串tmp=消息子字符串(0,位置);
tmp=tmp+更换;
tmp=tmp+message.substring(pos+find.length());
消息=tmp;
pos=子pos(消息、查找);
}
System.out.println(消息);
--剪断--
//复制indexOf的函数
公共静态int子对象(字符串str、字符串子对象)
{
对于(int i=0;i

我希望这有帮助。:-)

什么是以冒号分隔的字符串表情符号?
?类似这样的内容:smile:which将代表例如0x1F603的unicode表情符号。那么您必须有一个替换列表。例如:
myString=myString.replace(“0x1F603”,“simle:”)-显然,在循环中完成,从。。。arrays/arraylist/…/数据库表/replaceAll()的使用可能存在的问题。我假设“message”是一个属性变量,它是一个字符串。replaceAll()的第一个参数是字符串,但它被解释为正则表达式。这表明它可能会被Unicode字符所代表的多个字节所混淆。为了验证这一点,您可以尝试自己使用一个小llop来解析字符串,用indexOf()和substring()代替replaceAll()@Frank N Stein是的,我有一个映射所有这些的列表,但是,根据您的示例,unicode不是用字符串表示的,而是用字符表示的,例如,表情映射的JSONObject如下所示:“微笑”,