【问题标题】:How to remove Unicode decimal values of Unicode miscellaneous Symbols in String in Java如何在 Java 中删除字符串中 Unicode 杂项符号的 Unicode 十进制值
【发布时间】:2020-03-15 03:28:03
【问题描述】:

我正在删除或替换在 Web 应用程序的文本区域字段中使用的字符串(在 Java 中)中的杂项符号。发生的情况是,当我使用下面的内容时,内容被转换为 unicode十进制表示值。

内容是: 字符串 a = '最后搜索结果公告板 验证 ⛔ 0 ⚡ 1 ⚠ 6 ? 0'

当我将该内容保存在文本区域(即网页中)时,该符号将保存为 ⛔,⚡,⚠.

我想删除 unicode 表示值(或)以正确的格式保存内容,以便我可以将正确的数据保存到数据库中。

如何从字符串中删除符号(“⛔”或“⚡”或“⚠”)的 Unicode 表示值? 实际上我试图用正则表达式来替换下面的那些表示 s.replaceAll("[9728 - 9983];", "")。范围 [9728 - 9983] 表示杂项符号 unicode 十进制值范围。但它没有正确替换它。 我可以使用哪个正则表达式?或者可以使用哪种方法来删除字符串中的值?

(或)

如何在字符串中将 unicode 表示值('⛔' 或 '⚡' 或 '⚠')再次转换为相同的符号(⛔ ,⚡ ,⚠ )?

【问题讨论】:

    标签: java string unicode symbols


    【解决方案1】:

    我还没有在 Java 中找到这样的实用程序。你只需要以“硬”的方式去做。

    请注意,这不包括十六进制等效项(例如 ⛔)或长度不等于 4 的十进制值。

    public static String htmlCharsDecode(String string) {
        int           length = string.length();
        StringBuilder out    = new StringBuilder(length);
    
        NumberFormat  parser = NumberFormat.getInstance();
        ParsePosition pos       = new ParsePosition(0);
    
        for (int i = 0; i < length; i++) {
            char c = string.charAt(i);
    
            if (c == '&' && i < length - 6 && string.charAt(i + 1) == '#' && string.charAt(i + 6) == ';') {
                String codepointString = string.substring(i + 2, i + 6);
    
                pos.setIndex(0);
                Number value = parser.parse(codepointString, pos);
    
                boolean isDecimal = pos.getIndex() == codepointString.length();
                if (isDecimal) {
                    int codepoint = value.intValue();
                    if (codepoint >= 9728 && codepoint <= 9999) {
                        out.append((char)codepoint);
                        i += 6;
                        continue;
                    }
                }
            }
    
            out.append(c);
        }
    
        return out.toString();
    }
    

    您可以将parserpos 设为全局,以防止在每次调用时创建新对象,但要注意它们不是线程安全的。 (而且过早优化也不好)

    【讨论】:

      【解决方案2】:

      你需要用UTF-8渲染页面,并在表单中说服务器接受表单数据中的UTF-8。 (否则发送 &amp;#...; 实体而不是 Unicode 符号。)

      <form action="..." accept-charset="ISO-8859-1">
      

      在 HTML 5 中:

      <meta charset="UTF-8">
      

      旧版 HTML:

      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      

      也应该相应地设置响应头:

      Content-Type: text/html; charset=UTF-8
      
      response.setContentType("text/html; charset=UTF-8");
      response.setCharacterEncoding("UTF-8");
      

      【讨论】:

        【解决方案3】:

        有一些库可以取消转义 HTML 实体,例如JSoup Parser.unescapeEntities() 方法。

        如果您想简单地删除表情符号,请查看this answer which uses a white-list filter approach

        String input = "Last Validations ⛔ 0 ⚡ 1 ⚠ 6 ? 0";
        String characterFilter = "[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]";
        String emotionless = input.replaceAll(characterFilter,""); 
        System.out.println(emotionless); // Last Validations  0  1  6 ? 0
        

        【讨论】:

          猜你喜欢
          • 2018-01-23
          • 2017-03-23
          • 2013-05-13
          • 1970-01-01
          • 2016-08-29
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          • 2018-10-05
          相关资源
          最近更新 更多