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

如何获取反向字符串(unicode安全)

阎声
2023-03-14
问题内容

让我们假设我们要还原以下字符串“áe”。

该代码为“ \ u0061 \ u0301 \ u0065”。

恢复它的幼稚方法是逐个字符

private static String reverseStringNaive(String s) {
    char[] characters = new char[s.length()];
    for (int i = s.length() - 1; i >= 0; i--) {
        int j = s.length() - i - 1;
        characters[j] = s.charAt(i); 
    }
    return new String(characters);
}

当我们希望获得“eá”(\ u0065 \ u0061 \ u0301)时,它会给我们“éa”(\ u0065 \ u0301 \
u0061)。重音“´”应与“ a”粘贴在一起,而不要更改为“ e”。

以下代码为我提供了该字符串的预期结果:

private static String reverseString(String s) {
    char[] characters = new char[s.length()];
    for (int i = s.length() - 1; i >= 0; i--) {
        int j = s.length() - i - 1;
        if (Character.isLetterOrDigit(s.charAt(i)) || Character.isISOControl(s.charAt(i))) {
            characters[j] = s.charAt(i); 
        } else {
            characters[j] = s.charAt(i-1);
            characters[j+1] = s.charAt(i);
            i--;
        }
    }
    return new String(characters);
}

我正在检查每个字符是否为字母,数字或ISO控件。如果不是,我假设它应该与前一个字符结合在一起。

问题是,还有其他我应该检查或担心的事情吗?我的方法还是很幼稚吗?


问题答案:

您也可以通过将字符串转换为NFC规范分解来解决您的问题。基本上,java.text.Normalizer类可用于组合重音符号和其他组合字符及其基本字符,因此您将能够正确地进行反转。

所有其他这些想法(String.reverse(),StringBuffer.reverse())将正确反转缓冲区中的字符,但是如果以分解的字符开头,则可能无法获得期望的结果:)。

在某些“分解形式”中,重音字符与其基本形式分开存储(作为单独的字符),但在“组合”形式中却不是。因此,“
ae”以一种形式存储为三个字符,而另一种以组合形式存储为两个字符。

但是,这样的规范化不足以处理其他类型的字符组合,也无法解决Unicode星体平面中的字符,这些字符在Java中存储为两个字符(或更多?)。

感谢tchrist指出了ICU对文本分割的支持,包括扩展的字素簇,例如下面的注释中所标识的(参见virama)。
此资源似乎是此类资料的权威信息来源。



 类似资料:
  • 问题内容: 我不知道如何从字符串中获取Unicode字符。例如,如果字符串是“你好”,我如何获得第一个字符“你”? 从另一个地方我得到一种方法: 确实有效。但是我仍然有一些问题: 还有另一种方法吗? 为什么在Go中不能从字符串中获取Unicode字符,却可以获取字节数据? 问题答案: 首先,您可能需要阅读https://blog.golang.org/strings 。它将回答您的部分问题。 Go

  • 问题内容: 我正在使用 Python 2 从 ASCII编码的 文本文件中解析JSON 。 当使用或 加载这些文件时,我所有的字符串值都转换为Unicode对象而不是字符串对象。问题是,我必须将数据与仅接受字符串对象的某些库一起使用。我 无法更改库, 也 无法 更新它们。 是否可以获取字符串对象而不是Unicode对象? 更新资料 很久以前 ,当我坚持使用 Python 2 时就问 了 这个问题。

  • 我有一个方法,它返回字符串类型的字段对象列表。 这个方法应该将所有字符串字段都大写: 问题是:"field.set(...)"不起作用。它应该将值大写并将其设置为该字段的新值,但它不起作用...我如何解决这个问题的任何想法?(PS:在真正的代码中,"something Class.class"被设置为真正的类名...) 正在生成的错误是field.get(this)方法(insdefield.se

  • 问题内容: Java中的String数据类型使我们可以通过codePointCount知道一个字符串中有多少个Unicode字符。以及如何通过codePointAt获取第n个unicode char。我很想知道是否有一个API来获取包含Java中前N个unicode字符的子字符串。 谢谢, 问题答案: 没有一个方法可以一次调用,但可以帮助您完成此操作。

  • 问题内容: 有什么方法可以获取字符的键码吗?例如 有没有类似的东西? 谢谢 问题答案: 输出: 只是为了转义字符,您必须像字符一样使用

  • 我有两根绳子 在两种情况下,我应该删除