Dúvida com relação offsetByCodePoints da classe String

Boa noite gente,

então estou fazendo (mais para estudo) uma espécie de estudo da Classe String. Só que me deparei com um método que não estou entendendo o funcionamento nem olhando para a javadoc dela. Alguém saberia me explicar o que faz o método offsetByCodePoints da classe String?

[]s
Rafael Oliveira

veja este output:

        String greeting = "he\uD835\uDD6bllo";
        
        System.out.println("String: " + greeting); 
        System.out.println("Number of code units in greeting is " + greeting.length());
        int n = greeting.codePointCount(0,greeting.length());
        System.out.println("Number of code points " + n);
        
        for(int i=0;i<n;i++){
          int index = greeting.offsetByCodePoints(0,i);
          char cp = greeting.charAt(index);
          System.out.println("Code point at index= " + index + " is= " + cp);
        }
String: he𝕫llo
Number of code units in greeting is 7
Number of code points 6
Code point at index= 0 is= h
Code point at index= 1 is= e
Code point at index= 2 is= ?
Code point at index= 4 is= l
Code point at index= 5 is= l
Code point at index= 6 is= o

é importante entender a diferença entre um char e um code point.

aprendemos que strings são coleções de chars. isso é verdade em 7-bit ASCII. quando vc quer usar outras letras vc precisa usar codificações diferentes como UTF-8, 16, 32, etc

nesse caso uma letra pode ter mais de um byte, no nosso exemplo o par \uD835\uDD6b são 2 “chars” ( os bytes 0xD835 e 0xDD6b ). juntos eles representam a letra 𝕫 - chamamos isso de code point

ai q entra o problema: vc tem 7 “chars” mas apenas 6 code points ou “letras”. isso significa que o tamanho da string e o tamanho das coisas que vc pode “imprimir” é diferente.

é bem dificil vc trabalhar quando uma letra pode ser representada por um ou 3 bytes e o tamanho é variavel. vc tem metodos como este onde vc quer retornar o index no contexto “char” para algo que vc conta no contexto “code point”.

pra que isso? pra trabalhar com substrings, por exemplo. perceba que o indice 2 dois é impresso como ? pois não existe uma representação ascii para o primeiro byte daquele caracter. em seguida eu pulo para o indice 4 pois o indice 3 é uma parte do code point anterior.

nesse exemplo, imagine que vc queira quebrar a string em questão ao meio, pensando em ‘code points’. vai ver que este metodo passa a fazer sentido.

pegue este exemplo e começe a brincar. estude sobre unicode e “surrogate pairs” que uma hora a ficha cai ( comigo demorou tb )

1 curtida

Cara, muito boa a sua explicação, de verdade, muito obrigado :slight_smile:

[]s
Rafael Oliveira