Java 如何将表示表情符号的unicode字符替换为冒号分隔的字符串表情符号?
我有一个JSON将所有unicode表情映射到它们的冒号分隔字符串表示形式(就像twitter使用的那样)。我已经将该文件导入到PairJava 如何将表示表情符号的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>
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如下所示:“微笑”,