TLDR
Java使用两个字符来表示UTF-16。使用Arrays.sort(不稳定排序)会影响字符排序。我应该将char[]转换为int[]还是有更好的方法?
Details
Java将字符表示为UTF-16。但是Character类本身包装了char(16位)。对于UTF-16,它将是两个char(32位)的数组。
使用内置排序算法对一个由UTF-16字符组成的字符串进行排序会影响数据。(Arrays.sort使用双轴快速排序,而Collections.sort使用Arrays.sort来完成繁重的工作。)
具体来说,您是否应该将char[]转换为int[]或者有更好的排序方法?
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] utfCodes = {128513, 128531, 128557};
String emojis = new String(utfCodes, 0, 3);
System.out.println("Initial String: " + emojis);
char[] chars = emojis.toCharArray();
Arrays.sort(chars);
System.out.println("Sorted String: " + new String(chars));
}
}
输出:
Initial String:
Sorted String: ????
char
就是一个UTF-16单元。猜猜为什么它被称为“UTF-16”,以及它与char
有16位这一事实有什么关系。你可能需要两个UTF-16单元来编码一个单一的代码点,但这并不是Java的char
的错。 - Holger