Java根据utf-8编码索引查找字符串的索引

标签 java string encoding java-8 byte

考虑以下字符串:

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/

相关文章:

java - 在 onCreateView 方法之外的 Fragment Activity 中使用 Edittext

java - java中如何组合数组列表字符串?

java - Android 中的 iText 合并 pdf 错误,使用最新的库

string - 比较 String.Index 值

linux - 在 Linux 中使用 sed 替换字符串

MySQL:问号而不是符号

java - 从 Double ArrayList 更改为 Integer ArrayList

c# - 替换字符串中的单个字符

网页内Java字符串编码转换

php - 通过ajax(html)将Html文本发送到php脚本以存储在数据库中。它只保存到