utf8 getbytes example convertir codification codificar bytes java string unicode

getbytes - string codification java



¿Cómo puedo reemplazar los caracteres Unicode no imprimibles en Java? (5)

He rediseñado el código de los números de teléfono +9 (987) 124124 Extraiga dígitos de una cadena en Java

public static String stripNonDigitsV2( CharSequence input ) { if (input == null) return null; if ( input.length() == 0 ) return ""; char[] result = new char[input.length()]; int cursor = 0; CharBuffer buffer = CharBuffer.wrap( input ); int i=0; while ( i< buffer.length() ) { //buffer.hasRemaining() char chr = buffer.get(i); if (chr==''u''){ i=i+5; chr=buffer.get(i); } if ( chr > 39 && chr < 58 ) result[cursor++] = chr; i=i+1; } return new String( result, 0, cursor ); }

Lo siguiente reemplazará los caracteres de control ASCII (abreviatura de [/x00-/x1F/x7F] ):

my_string.replaceAll("//p{Cntrl}", "?");

Lo siguiente reemplazará todos los caracteres ASCII no imprimibles (abreviatura de [/p{Graph}/x20] ), incluidos los caracteres acentuados:

my_string.replaceAll("[^//p{Print}]", "?");

Sin embargo, ninguno funciona para cadenas Unicode. ¿Alguien tiene una buena manera de eliminar los caracteres no imprimibles de una cadena Unicode?


Op De Cirkel es en su mayoría correcta. Su sugerencia funcionará en la mayoría de los casos:

myString.replaceAll("//p{C}", "?");

Pero si myString puede contener puntos de código que no sean BMP, entonces es más complicado. /p{C} contiene los puntos de código suplentes de /p{Cs} . El método de reemplazo anterior corromperá los puntos de código que no sean BMP al reemplazar en ocasiones solo la mitad del par suplente. Es posible que esto sea un error de Java en lugar de un comportamiento previsto.

Usar las otras categorías constituyentes es una opción:

myString.replaceAll("[//p{Cc}//p{Cf}//p{Co}//p{Cn}]", "?");

Sin embargo, los caracteres sustitutos solitarios que no forman parte de un par (cada personaje sustituto tiene un punto de código asignado) no se eliminarán. Un enfoque no-regex es la única forma que sé manejar adecuadamente /p{C} :

StringBuilder newString = new StringBuilder(myString.length()); for (int offset = 0; offset < myString.length();) { int codePoint = myString.codePointAt(offset); offset += Character.charCount(codePoint); // Replace invisible control characters and unused code points switch (Character.getType(codePoint)) { case Character.CONTROL: // /p{Cc} case Character.FORMAT: // /p{Cf} case Character.PRIVATE_USE: // /p{Co} case Character.SURROGATE: // /p{Cs} case Character.UNASSIGNED: // /p{Cn} newString.append(''?''); break; default: newString.append(Character.toChars(codePoint)); break; } }


Puede que le interesen las categorías Unicode "Otro, Control" y posiblemente "Otro, Formato" (desafortunadamente, este último parece contener tanto caracteres imprimibles como no imprimibles).

En expresiones regulares de Java, puede verificarlas usando /p{Cc} y /p{Cf} respectivamente.


métodos en golpe para su objetivo

public static String removeNonAscii(String str) { return str.replaceAll("[^//x00-//x7F]", ""); } public static String removeNonPrintable(String str) // All Control Char { return str.replaceAll("[//p{C}]", ""); } public static String removeSomeControlChar(String str) // Some Control Char { return str.replaceAll("[//p{Cntrl}//p{Cc}//p{Cf}//p{Co}//p{Cn}]", ""); } public static String removeFullControlChar(String str) { return removeNonPrintable(str).replaceAll("[//r//n//t]", ""); }


my_string.replaceAll("//p{C}", "?");

Ver más sobre Unicode regex . java.util.regexPattern / String.replaceAll admite.