### Elasticsearch Version

8.0.0+

### Installed Plugins

_No response_

### Java Version

*ANY*

### OS Version

*ANY*

### Problem Description

Tokenizing a specific sequence with WordPiece (BERT) may throw an unexpected error "startOffset must be non-negative"

This has to do for sure with normalizing and stripping accents within the `BasicTokenFilter`. I am thinking that we need to further adjust offsets for those tokens given the actions of stripping the accents and normalizing the string.

### Steps to Reproduce

 - deploy `sentence-transformers/all-minilm-l12-v2`
 - attempt to embed: "From the Greek name Î½Î¹ÎºÎ¿Î»Î±Î¿Ï (Nikolaos) which meant victory of the people from Greek Î½Î¹ÎºÎ· (nike) victory and Î»Î±Î¿Ï (laos) people.Saint Nicholas was a 4th-century bishop from Anatolia who, according to legend, saved the daughters of a poor man from lives of prostitution.rom the Greek name Î½Î¹ÎºÎ¿Î»Î±Î¿Ï (Nikolaos) which meant victory of the people from Greek Î½Î¹ÎºÎ· (nike) victory and Î»Î±Î¿Ï (laos) people."
 - see the failure

### Logs (if relevant)

```
 java.lang.IllegalArgumentException: startOffset must be non-negative, and endOffset must be >= startOffset; got startOffset=320,endOffset=319
        at org.apache.lucene.core@9.3.0-snapshot-b8d1fcfd0ec/org.apache.lucene.analysis.tokenattributes.PackedTokenAttributeImpl.setOffset(PackedTokenAttributeImpl.java:125)
        at org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BasicTokenFilter.incrementToken(BasicTokenFilter.java:116)
        at org.elasticsearch.xpack.ml.inference.nlp.tokenizers.WordPieceTokenFilter.incrementToken(WordPieceTokenFilter.java:106)
        at org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer.innerTokenize(BertTokenizer.java:221)
        at org.elasticsearch.xpack.ml.inference.nlp.tokenizers.NlpTokenizer.tokenize(NlpTokenizer.java:56)
        at org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer.lambda$requestBuilder$0(BertTokenizer.java:204)
        at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
        at java.base/java.util.stream.IntPipeline$1$1.accept(IntPipeline.java:180)
        at java.base/java.util.stream.Streams$RangeIntSpliterator.forEachRemaining(Streams.java:104)
        at java.base/java.util.Spliterator$OfInt.forEachRemaining(Spliterator.java:711)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer.lambda$requestBuilder$1(BertTokenizer.java:205)
        at org.elasticsearch.xpack.ml.inference.deployment.InferencePyTorchAction.doRun(InferencePyTorchAction.java:93)
```
x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenFilter.java
TokenStream stream = new BasicTokenFilter(
                    tokenizer,
                    CharSeqTokenTrieNode.EMPTY,
                    CharArraySet.EMPTY_SET,
                    isStripAccents,
                    isTokenizeCjkChars
                );
                return new TokenStreamComponents(tokenizer, stream);
            }
            @Override
            protected Reader initReader(String fieldName, Reader reader) {
                return new ControlCharFilter(reader);
            }
        };
        CharArraySet neverSplitSet = new CharArraySet(neverSplit, false);
        CharSeqTokenTrieNode neverSplitTree;
        try (analyzer) {
            neverSplitTree = CharSeqTokenTrieNode.build(neverSplit, c -> {
                try (TokenStream ts = analyzer.tokenStream("never_split", c)) {
                    CharTermAttribute term = ts.addAttribute(CharTermAttribute.class);
                    ts.reset();
                    List<String> tokens = new ArrayList<>();
                    while (ts.incrementToken()) {
                        tokens.add(term.toString());
                    }
                    return tokens;
                }
            });
        }
        return new BasicTokenFilter(input, neverSplitTree, neverSplitSet, isStripAccents, isTokenizeCjkChars);