Agregar más información a las respuestas anteriores de esta publicación.
Probado en Java-12, debería funcionar en todas las versiones de Java anteriores a 5.
Como se menciona aquí: https://stackoverflow.com/a/47505451/2987755 ,
cualquier carácter (cuyo Unicode esté por encima de U + FFFF) se representa como un par sustituto, que Java almacena como un par de valores de caracteres, es decir, el Unicode único El carácter se representa como dos caracteres Java adyacentes.
Como podemos ver en el siguiente ejemplo.
1. Longitud:
"🌉".length() //2, Expectations was it should return 1
"🌉".codePointCount(0,"🌉".length()) //1, To get the number of Unicode characters in a Java String
2. Igualdad:
represente "🌉" en String usando Unicode \ud83c\udf09
como se muestra a continuación y verifique la igualdad.
"🌉".equals("\ud83c\udf09") // true
Java no es compatible con UTF-32
"🌉".equals("\u1F309") // false
3. Puede convertir caracteres Unicode en cadenas Java
"🌉".equals(new String(Character.toChars(0x0001F309))) //true
4. String.substring () no considera caracteres suplementarios
"🌉🌐".substring(0,1) //"?"
"🌉🌐".substring(0,2) //"🌉"
"🌉🌐".substring(0,4) //"🌉🌐"
Para resolver esto podemos usar String.offsetByCodePoints(int index, int codePointOffset)
"🌉🌐".substring(0,"🌉🌐".offsetByCodePoints(0,1) // "🌉"
"🌉🌐".substring(2,"🌉🌐".offsetByCodePoints(1,2)) // "🌐"
5. Iteración cadena Unicode con BreakIterator
6. Clasificación Cuerdas con Unicode java.text.Collator
7. Carácter de toUpperCase()
, toLowerCase()
, los métodos no deben utilizarse, en cambio, en mayúsculas y minúsculas uso de cuerdas de especial configuración regional.
8. Character.isLetter(char ch)
no admite, mejor utilizado Character.isLetter(int codePoint)
, para cada methodName(char ch)
método en la clase de caracteres habrá un tipo de los methodName(int codePoint)
cuales pueden manejar caracteres suplementarios.
9. Especificar charset en String.getBytes()
, la conversión de Bytes a String, InputStreamReader
,OutputStreamWriter
Ref:
https://coolsymbol.com/emojis/emoji-for-copy-and-paste.html#objects
https://www.online-toolz.com/tools/text-unicode-entities-convertor.php
https: //www.ibm.com/developerworks/library/j-unicode/index.html
https://www.oracle.com/technetwork/articles/javaee/supplementary-142654.html
Más información sobre el ejemplo image1 image2
Otros términos que vale la pena explorar: Normalización , BiDi