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

Java根据utf-8编码索引查找字符串的索引,java,string,encoding,java-8,byte,Java,String,Encoding,Java 8,Byte,考虑以下字符串: String text="un’accogliente villa del."; 我有单词“acogliente”的开始索引,它是5。但它是基于utf-8编码预先计算的 我想要单词的确切索引,它是3,作为输出。也就是说,我想从5得到3作为输出。计算它的最佳方法是什么?下面的代码将以3的形式返回输出我是否遗漏了您的问题 String text="un’accogliente villa del."; text.indexOf("accogliente"); 下面的代码将返回输

考虑以下字符串:

String text="un’accogliente villa del.";
我有单词“
acogliente
”的开始索引,它是
5
。但它是基于
utf-8
编码预先计算的


我想要单词的确切索引,它是
3
,作为输出。也就是说,我想从5得到3作为输出。计算它的最佳方法是什么?

下面的代码将以
3
的形式返回输出我是否遗漏了您的问题

String text="un’accogliente villa del.";
text.indexOf("accogliente");

下面的代码将返回输出为
3
您的问题中我是否遗漏了什么

String text="un’accogliente villa del.";
text.indexOf("accogliente");
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();
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();

假设这个
startIndex
只能是一个字母(ASCII),您可以:

String text = "un’accogliente villa del.";
char c = text.charAt(5);
String normalized = Normalizer.normalize(text, Normalizer.Form.NFD);
normalized = normalized.replaceAll("[^\\p{ASCII}]", " ");

Pattern p = Pattern.compile("\\p{L}*?" + c + "\\p{L}*?[$|\\s]");
Matcher m = p.matcher(normalized);

if (m.find()) {
     System.out.println(m.start(0));
}

假设这个
startIndex
只能是一个字母(ASCII),您可以:

String text = "un’accogliente villa del.";
char c = text.charAt(5);
String normalized = Normalizer.normalize(text, Normalizer.Form.NFD);
normalized = normalized.replaceAll("[^\\p{ASCII}]", " ");

Pattern p = Pattern.compile("\\p{L}*?" + c + "\\p{L}*?[$|\\s]");
Matcher m = p.matcher(normalized);

if (m.find()) {
     System.out.println(m.start(0));
}

如果我理解正确,你为什么不使用indexOf
,它正确地给出了3?
“un'accogliente villa del.”。indexOf(“accogliente”)==3
我已经编辑了这个问题。我没有accogliente这个词。我只有utf-8的句子和索引,即5。根据这些值,我需要找到3@Eugeneso你有一个句子和一个startIndex=5。你想得到包含startIndex(
5
)的单词所在的索引吗?我有单词“accogliente”的开始索引,它是5,这是什么意思?投票以不清楚的方式结束……如果我理解正确,你为什么不使用indexOf
,它正确地给出了3?
“un'accogliente villa del.”。indexOf(“accogliente”)==3
我已经编辑了这个问题。我没有accogliente这个词。我只有utf-8的句子和索引,即5。根据这些值,我需要找到3@Eugeneso你有一个句子和一个startIndex=5。你想得到包含startIndex(
5
)的单词所在的索引吗?我有单词“accogliente”的开始索引,它是5,这是什么意思?投票决定以不清楚的方式结束……OP解释说这不是他想要的。是的……明白了@GlainsOP解释说这不是他想要的。是的……明白了@Glains@JoopEggenOP的要求似乎有点不同,他/她有一个
startIndex=5
,他必须找到包含该字母的单词(首先我假设),然后剥离非ascii字母,找到该单词所在的索引。我想这就是他想要的needs@TweetMan抱歉输入错误,
java.text.Normalizer
java.text.Normalizer.Form.NFKC
;对于这个问题,文本规范化并不是真的需要。@Eugene他提到UTF-8似乎表明5是
acco
的字节索引。特别是由于UTF-8中的特殊引号U+2019确实有3个字节长。@JoopEggen似乎OP的要求有点不同,他/她有一个
startIndex=5
,他必须找到包含该字母的单词(首先我假设),然后剥离非ascii字母找到该单词所在的索引。我想这就是他想要的needs@TweetMan抱歉输入错误,
java.text.Normalizer
java.text.Normalizer.Form.NFKC
;对于这个问题,文本规范化并不是真的需要。@Eugene他提到UTF-8似乎表明5是
acco
的字节索引。特别是特别报价U+2019在UTF-8中确实有3个字节长。