wake-up-neo.com

Ersetzen Sie nicht ASCII Zeichen aus Zeichenfolge

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. 

61
rahulsri

Dadurch werden alle nichtASCIIBuchstaben gesucht:

String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");
136
FailedDev

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.

64

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}

19
stema

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());
2
mmodi

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();

    } 
0