Ich habe Strings A função
, Ãugent
, in denen ich Zeichen wie ç
, ã
, Ã
durch leere Zeichenfolgen ersetzen muss.
Wie kann ich nur die NichtASCII Zeichen zuordnen?
ich benutze eine Funktion
public static String matchAndReplaceNonEnglishChar(String tmpsrcdta)
{
String newsrcdta = null;
char array[] = Arrays.stringToCharArray(tmpsrcdta);
if (array == null)
return newsrcdta;
for (int i = 0; i < array.length; i++)
{
int nVal = (int)array[i];
boolean bISO = Character.isISOControl(array[i]); // Is character ISO control
boolean bIgnorable = Character.isIdentifierIgnorable(array[i]); // Is Ignorable identifier
// Remove tab and other unwanted characters..
if (nVal == 9 || bISO || bIgnorable)
array[i] = ' ';
else if (nVal > 255)
array[i] = ' ';
}
newsrcdta = Arrays.charArrayToString(array);
return newsrcdta;
}
aber es funktioniert nicht richtig. Welche Verbesserung ist nötig? Hier habe ich noch ein Problem: Die letzte Zeichenfolge wird durch Leerzeichen ersetzt, die den zusätzlichen Platz in Zeichenfolge schaffen.
Dadurch werden alle nichtASCIIBuchstaben gesucht:
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");
FailedDevs Antwort ist gut, kann aber verbessert werden. Wenn Sie die ASCII-Äquivalente beibehalten möchten, müssen Sie zuerst normalisieren:
String subjectString = "öäü";
subjectString = Normalizer.normalize(subjectString, Normalizer.Form.NFD);
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");
=> will produce "oau"
Auf diese Weise werden Zeichen wie "öäü" auf "oau" abgebildet, wodurch zumindest einige Informationen erhalten bleiben. Ohne Normalisierung ist der resultierende String leer.
Dies wäre die Unicode-Lösung
String s = "A função, Ãugent";
String r = s.replaceAll("\\P{InBasic_Latin}", "");
\p{InBasic_Latin}
ist der Unicode-Block, der alle Buchstaben im Unicode-Bereich U + 0000..U + 007F enthält (siehe regular-expression.info )
\P{InBasic_Latin}
ist der negierte \p{InBasic_Latin}
Sie können so etwas versuchen. Der Sonderzeichenbereich für Alphabete beginnt mit 192, sodass Sie solche Zeichen im Ergebnis vermeiden können.
String name = "A função";
StringBuilder result = new StringBuilder();
for(char val : name.toCharArray()) {
if(val < 192) result.append(val);
}
System.out.println("Result "+result.toString());
Oder Sie können die Funktion unten verwenden, um Nicht-ASCII-Zeichen aus der Zeichenfolge zu entfernen.
private static String removeNonASCIIChar(String str) {
StringBuffer buff = new StringBuffer();
char chars[] = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (0 < chars[i] && chars[i] < 127) {
buff.append(chars[i]);
}
}
return buff.toString();
}