我有一个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表情符号表示。
非常感谢任何帮助,谢谢!!
答案 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;
}
我希望这会有所帮助。 : - )