当前位置: 首页 > 面试题库 >

如何在Java中删除代理字符?

高海阳
2023-03-14
问题内容

我正面临一种情况,我在保存到MySql
5.1的文本中获得代理字符。由于不支持UTF-16,因此我想通过java方法手动删除这些代理对,然后再将其保存到数据库中。

我现在已经编写了以下方法,我很想知道是否有直接和最佳的方法来处理此问题。

在此先感谢您的帮助。

public static String removeSurrogates(String query) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < query.length() - 1; i++) {
        char firstChar = query.charAt(i);
        char nextChar = query.charAt(i+1);
        if (Character.isSurrogatePair(firstChar, nextChar) == false) {
            sb.append(firstChar);
        } else {
            i++;
        }
    }
    if (Character.isHighSurrogate(query.charAt(query.length() - 1)) == false
            && Character.isLowSurrogate(query.charAt(query.length() - 1)) == false) {
        sb.append(query.charAt(query.length() - 1));
    }

    return sb.toString();
}

问题答案:

这里有几件事:

  • Character.isSurrogate(char c)

当且仅当它是低代理代码单元或高代理代码单元时,char值才是代理代码单元。

  • 检查配对似乎毫无意义,为什么不删除所有替代物呢?

  • x == false 相当于 !x

  • StringBuilder 在不需要同步的情况下更好(例如,从未离开本地作用域的变量)。

我建议这样:

public static String removeSurrogates(String query) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < query.length(); i++) {
        char c = query.charAt(i);
        // !isSurrogate(c) in Java 7
        if (!(Character.isHighSurrogate(c) || Character.isLowSurrogate(c))) {
            sb.append(firstChar);
        }
    }
    return sb.toString();
}

分解if陈述

您询问了以下声明:

if (!(Character.isHighSurrogate(c) || Character.isLowSurrogate(c))) {
    sb.append(firstChar);
}

理解它的一种方法是将每个操作分解为自己的功能,因此您可以看到该组合可以实现您的期望:

static boolean isSurrogate(char c) {
    return Character.isHighSurrogate(c) || Character.isLowSurrogate(c);
}

static boolean isNotSurrogate(char c) {
    return !isSurrogate(c);
}

...

if (isNotSurrogate(c)) {
    sb.append(firstChar);
}


 类似资料:
  • 问题内容: 这是我的代码: 在搜寻这些网页时,我发现一些非AScii字符进入了从该脚本编写的html文件中,我需要删除这些字符或将其解析为可读字符。有什么建议吗?谢谢 问题答案: 字符为8字节(0-255),ascii字符为7字节(0-127),因此您只需删除ord值低于128的所有字符 chr将整数转换为字符,ord将字符转换为整数。 这应该是您的最终代码

  • 假设我有一个这样的字符串: 我想做的是删除字符串中的每12个字符,所以我会删除12个索引,然后是第24个,然后是第36个,等等,直到字符串结束。 我删除的索引(每12个或每2个)必须等于我拥有的字符变量,因为该变量会发生变化。 我尝试这样做与正则表达式: 但它不起作用。有帮助吗?

  • 问题内容: 如何在Java Servlet中删除cookie? 我尝试了这个:http : //www.jguru.com/faq/view.jsp?EID=42225 编辑:以下内容现在可以成功运行,它似乎是以下各项的组合: 和 在我做之前: 根据文档关闭浏览器时,cookie会过期。 负值表示cookie不会持久存储,并且在Web浏览器退出时将被删除。零值将导致cookie被删除。 使Cook

  • 问题内容: 如何在我的localDate中删除T? 我需要删除“ T”以匹配数据库中的数据。 这是我的代码 我得到以下输出: 删除“ T”字符的最佳方法是什么?有想法吗? 问题答案: 删除“ T”字符的最佳方法是什么?有想法吗? 使用来格式化所需方式的值… 哪个打印… 请记住,日期/时间对象只是自固定时间点(例如Unix纪元)以来经过的时间量的容器,它们没有自己的内部/可配置格式,它们倾向于使用当

  • 问题内容: 为了访问Java中String的各个字符,我们有。是否有任何内置函数来删除Java中String的单个字符? 像这样: 问题答案: 你也可以使用可变的类。 它具有方法deleteCharAt(),以及许多其他mutator方法。 只需删除需要删除的字符,然后得到结果,如下所示: 这样可以避免创建不必要的字符串对象。

  • 问题内容: 我有一个来自UI的字符串,其中可能包含控制字符,并且我想删除除 回车符 , 换行符 和 制表 符之外的所有控制字符。 现在,我可以找到两种删除所有控制字符的方法: 1-使用番石榴: 2-使用正则表达式: 问题答案: 如果要删除其他字符或控制uni-code类别中的所有字符,可以执行以下操作 注意: 实际上,这实际上从字符串中除去了(\ u008f)Unicode字符,而不是转义的形式“