gpt4 book ai didi

java - 在 Java 中反转 utf-8 字符串

转载 作者:行者123 更新时间:2023-11-29 09:38:55 24 4
gpt4 key购买 nike

我试图编写一个 Java 代码来反转 Java 中的 utf-8 字符串。我在一次采访中被问到这个问题。但是我想知道如果我将字节转换为位并从位中获取代码点,那么我们该如何编写代码。可能这就是面试官想要的。

class Ideone
{

public static void main(String[] args) {
String s ="Ž®aͻ";char[] ch = new char[s.length()];
StringBuilder sb = new StringBuilder(s);
StringBuilder rev = new StringBuilder();

for (int i=0; i< s.length(); i++) {

int x = sb.codePointAt(i);
char[] y = Character.toChars(x);
rev.append(y);
}
System.out.println(rev.reverse());

}

}

最佳答案

首先,所有 Java 字符串都是 UTF-16 编码的,而不是 UTF-8。这对于反转字符串之类的任务很重要,因为字符占用的字节数取决于编码。在 UTF-8 中,字节数是可变的,而在 UTF-16 中,它总是是两个字节。 char 是 16 位数据,即使它只是表示 ASCII。 UTF-8 可以用 8 位编码 ASCII,但可能需要更多位来表示其他字符。

因为 char 是 16 位,所以大多数字符(包括示例中的 Ž®aͻ)都很好地适合单独的 char,没有问题。然而,一些字符(特别是 Emoji 属于这一类)不能用单个 char 表示,现在我们正在处理 surrogate pairs .在处理可能具有代理项对的文本时,您必须非常小心地处理字符串操作,因为大多数 Java API(尤其是 String 上的几乎所有方法)都无法正确处理它们。

举个更好的例子,考虑字符串 "👶👧👩👵💀🤖"。六个字,对吧?不是根据 Java!

String s ="👶👧👩👵💀🤖";
System.out.println("String: " + s);
System.out.println("Length: " + s.length());
System.out.println("Chars: " + Arrays.toString(s.toCharArray()));
System.out.println("Split: " + Arrays.asList(s.split("")));

这打印:

String: 👶👧👩👵💀🤖
Length: 12
Chars: [?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?]
Split: [?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?]

现在,一些 API 确实可以正确处理代理项对,例如 StringBuilder.reverse() :

If there are any surrogate pairs included in the sequence, these are treated as single characters for the reverse operation. Thus, the order of the high-low surrogates is never reversed.

假设为了面试你不能使用这个方法(或者,可以理解,你不能当场记忆它是否安全),你可以迭代代码点String.codePoints() 的字符串.这使您可以安全地反转内容:

List<String> chars = s.codePoints()
.mapToObj(i -> String.valueOf(Character.toChars(i)))
.collect(Collectors.toList());
Collections.reverse(chars);
System.out.println(chars.stream().collect(Collectors.joining()));

打印:

🤖💀👵👩👧👶

关于java - 在 Java 中反转 utf-8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44741592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com