### 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/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenFilterTests.java
analyzer,
            " \tHeLLo!how  \n Are yoU? [UNK]",
            new String[] { "HeLLo", "!", "how", "Are", "yoU", "?", "[UNK]" }
        );
        assertAnalyzesToNoCharFilter(analyzer, "Hello [UNK]?", new String[] { "Hello", "[UNK]", "?" });
        assertAnalyzesToNoCharFilter(analyzer, "Hello [UNK]!!", new String[] { "Hello", "[UNK]", "!", "!" });
        assertAnalyzesToNoCharFilter(analyzer, "Hello~[UNK][UNK]", new String[] { "Hello", "~", "[UNK]", "[UNK]" });
        assertAnalyzesToNoCharFilter(analyzer, "Hello-[unk]", new String[] { "Hello", "-", "[", "unk", "]" });
    }
    public void testNeverSplit_GivenLowerCase() throws IOException {
        Analyzer analyzer = basicAnalyzerFromSettings(false, false, List.of("[UNK]"));
        assertAnalyzesToNoCharFilter(
            analyzer,
            " \tHeLLo!how  \n Are yoU? [UNK]",
            new String[] { "HeLLo", "!", "how", "Are", "yoU", "?", "[UNK]" }
        );
        assertAnalyzesToNoCharFilter(analyzer, "Hello [UNK].", new String[] { "Hello", "[UNK]", "." });
        assertAnalyzesToNoCharFilter(analyzer, "Hello [UNK]?", new String[] { "Hello", "[UNK]", "?" });
        assertAnalyzesToNoCharFilter(analyzer, "Hello [UNK]!!", new String[] { "Hello", "[UNK]", "!", "!" });
        assertAnalyzesToNoCharFilter(analyzer, "Hello-[UNK]", new String[] { "Hello", "-", "[UNK]" });
        assertAnalyzesToNoCharFilter(analyzer, "Hello~[UNK][UNK]", new String[] { "Hello", "~", "[UNK]", "[UNK]" });
        assertAnalyzesToNoCharFilter(analyzer, "Hello-[unk]", new String[] { "Hello", "-", "[", "unk", "]" });
    }
    public void testSplitCJK() throws Exception {
        Analyzer analyzer = basicAnalyzerFromSettings(true, false, List.of("[UNK]"));
        assertAnalyzesToNoCharFilter(analyzer, "hello ah\u535A\u63A8zz", new String[] { "hello", "ah", "\u535A", "\u63A8", "zz" });
        assertAnalyzesToNoCharFilter(analyzer, "hello world", new String[] { "hello", "world" });
    }
    public void testStripAccents() throws Exception {
        Analyzer analyzer = basicAnalyzerFromSettings(true, true, List.of("[UNK]"));