【问题标题】:How do I replace a unicode Character representing an emoji into a colon delimited String emoji?如何将表示表情符号的 unicode 字符替换为冒号分隔的字符串表情符号?
【发布时间】:2016-03-22 14:07:59
【问题描述】:

我有一个 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;
}

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

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

【问题讨论】:

  • 什么是a colon delimited String emoji?
  • 类似这样的东西 :smile: 例如代表 0x1F603 的 unicode 表情符号
  • 那么你必须有一个替换列表。即:myString = myString.replace("0x1F603", ":simle:"); - 显然,在一个循环中完成,该循环从...数组/数组列表/.../数据库表/任何东西中读取对
  • 你的问题可能出在replaceAll()的使用上。我假设“消息”是一个属性变量并且它是一个字符串。 replaceAll() 的第一个参数是一个字符串,但它被解释为正则表达式。这表明它可能会被 Unicode 字符所代表的多个字节所混淆。为了验证这一点,您可以尝试使用一个小的 llop 自己解析字符串,其中 indexOf() 和 substring() 代替 replaceAll()
  • @Frank N Stein 是的,我有一个映射所有这些的列表,但是根据您的示例,它不是由字符串表示的 unicode,而是表示为字符,例如 JSONObject因为那个表情符号映射看起来像这样:“ðŸ~„”:“微笑”,

标签: java android string unicode character


【解决方案1】:

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

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

我最好的猜测是 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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-20
    • 2020-06-23
    • 2021-11-07
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2021-02-23
    • 2020-05-12
    相关资源
    最近更新 更多