una predefinidas manejo funciones extraer ejemplos cortar caracteres caracter cadenas cadena buscar java string unicode character-encoding utf-16

java - predefinidas - ¿Cómo comparo cada uno de los caracteres de una Cadena mientras tengo en cuenta los caracteres con longitud> 1?



funciones predefinidas de javascript (4)

Esto será más sencillo si trata tanto la cadena como los datos que está buscando como String . Si solo necesitas probar la presencia de ese personaje:

if (string.contains("𩸽") { // do something here. }

Si necesita específicamente el índice donde aparece ese carácter:

int i = string.indexOf("𩸽"); if (i >= 0) { // do something with i here. }

Y si realmente necesita iterar a través de cada punto de código, consulte ¿Cómo puedo iterar a través de los puntos de código Unicode de una cadena Java? .

Tengo una cadena variable que puede contener cualquier carácter Unicode. Uno de estos caracteres Unicode es el han 𩸽 .

La cosa es que este carácter "han" tiene "𩸽".length() == 2 pero está escrito en la cadena como un solo carácter.

Considerando el código a continuación, ¿cómo iteraré sobre todos los caracteres y compararé cada uno considerando el hecho de que podría contener un carácter con una longitud mayor que 1?

for ( int i = 0; i < string.length(); i++ ) { char character = string.charAt( i ); if ( character == ''𩸽'' ) { // Fail, it interprets as 2 chars =/ } }

EDITAR:
Esta pregunta no es un duplicado. Esto pregunta cómo iterar para cada carácter de una cadena mientras se consideran caracteres que contienen .length() > 1 (el carácter no es un tipo char sino como la representación de un símbolo escrito). Esta pregunta no requiere conocimientos previos de cómo iterar sobre puntos de código Unicode de una cadena Java, aunque una respuesta que menciona también puede ser correcta.


Los métodos String.charAt y String.length tratan a String como una secuencia de unidades de código UTF-16. Desea tratar la cadena como puntos de código Unicode.

Mire los métodos de "punto de código" en la API de cadena:

  • codePointAt(int index) devuelve el punto de código (32 bits) en un índice de unidad de código dado
  • offsetByCodePoints(int index, int codePointOffset) devuelve el índice de unidad de código correspondiente a los puntos de código codePointOffset de la unidad de código en el index .
  • codePointCount(int beginIndex, int endIndex) cuenta los puntos de código entre dos índices de unidades de código.

Indicar la cadena por índice de punto de código es un poco complicado, especialmente si la cadena es larga y desea hacerlo de manera eficiente. Sin embargo, es factible, aunque el código es bastante engorroso.

La respuesta de @sstan es una solución.


Un carácter ASCII toma la mitad de lo que hace un personaje de Unicode, por lo que es lógico que el carácter de han sea de longitud 2. No es un carácter ASCII, ni una letra de Unicode. Si fuera el segundo caso, la carta se mostraría correctamente.


int hanCodePoint = "𩸽".codePointAt(0); for (int i = 0; i < string.length();) { int currentCodePoint = string.codePointAt(i); if (currentCodePoint == hanCodePoint) { // do something here. } i += Character.charCount(currentCodePoint); }