Ich habe Strings A função
, Ãugent
in denen ich brauche wie zu ersetzen Zeichen ç
, ã
, Ã
mit leeren Saiten.
Wie kann ich nur diese Nicht-ASCII-Zeichen abgleichen?
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 es benötigt ... hier habe ich ein weiteres Problem ist, dass die letzte Zeichenfolge durch Leerzeichen ersetzt wird, die das zusätzliche Leerzeichen in der Zeichenfolge erzeugen.
Antworten:
Dadurch werden alle Nicht- ASCII- Buchstaben gesucht und ersetzt :
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");
quelle
"[^\\x20-\\x7E]"
Oder einfach:"[^ -~]"
Die Antwort von FailedDev 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 "öäü" "oau" zugeordnet, wodurch zumindest einige Informationen erhalten bleiben. Ohne Normalisierung ist der resultierende String leer.
quelle
Normalizer.normalize("ãéío – o áá", Normalizer.Form.NFD).replaceAll("[^\\x00-\\x7F]", "");
ergibt "aeio o aa", aberecho "ãéío – o áá" | iconv -f utf8 -t ascii//TRANSLIT
ergibt "aeio - o aa". Gibt es eine Möglichkeit, Java dazu zu bringen, "-" durch "-" wie durch iconv zu ersetzen?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 reguläre Ausdrucksinfo ).\P{InBasic_Latin}
ist das negierte\p{InBasic_Latin}
quelle
Sie können so etwas versuchen. Der Bereich für Sonderzeichen für Alphabete beginnt bei 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());
quelle
Oder Sie können die folgende Funktion verwenden, um Nicht-ASCII-Zeichen aus der Zeichenfolge zu entfernen. Sie werden interne Arbeit kennenlernen.
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(); }
quelle
[Aktualisierte Lösung]
kann mit "Normalize" (Canonical Decomposition) und "replaceAll" verwendet werden, um es durch die entsprechenden Zeichen zu ersetzen.
import java.text.Normalizer; import java.text.Normalizer.Form; import java.util.regex.Pattern; public final class NormalizeUtils { public static String normalizeASCII(final String string) { final String normalize = Normalizer.normalize(string, Form.NFD); return Pattern.compile("\\p{InCombiningDiacriticalMarks}+") .matcher(normalize) .replaceAll(""); } ...
quelle