考虑以下字符串:
String text="un’accogliente villa del.";
我有单词“accogliente
”的开始索引,即5
。但它是根据utf-8
编码预先计算出来的。
我想要单词 的确切索引,即 3
作为输出。即,我想从 5 中得到 3 作为输出。计算它的最佳方法是什么?
最佳答案
String text = "un’accogliente villa del."; // Unicode text
text = Normalizer.normalize(text, Form.NFC); // Normalize text
byte[] bytes = text.getBytes(StandardCharsets.UTF_8); // Index 5 UTF-8; 1 byte
char[] chars = text.toCharArray(); // Index 3 UTF-16; 2 bytes (indexOf)
int[] codePoints = text.codePoints().toArray(); // Index 3 UTF-32; 4 bytes
int charIndex = text.indexOf("accogliente");
int codePointIndex = (int) text.substring(0, charIndex).codePoints().count();
int byteIndex = text.substring(0, charIndex).getBytes(StandardCharsets.UTF_8).length;
UTF-32 是 Unicode 代码点,所有带有 U+XXXX 的符号的编号,其中可能多(或少)于4 个十六进制数字。
需要文本规范化,因为 é
可以是一个代码点或两个代码点,一个零宽度的 ´
后跟一个 e
.
UTF-8字节索引转UTF-16字符索引的问题:
int charIndex = new String(text.getBytes(StandardCharsets.UTF_8),
0, byteIndex, StandardCharsets.UTF_8).length();
关于Java根据utf-8编码索引查找字符串的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51708795/