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?
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 )