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

2 respostas
stringjava
rafa_so

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

2 Respostas

peczenyj

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 )

rafa_so

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

[]s
Rafael Oliveira

Criado 18 de outubro de 2016
Ultima resposta 18 de out. de 2016
Respostas 2
Participantes 2