Заменить не ASCII символ из строки - PullRequest
65 голосов
/ 15 декабря 2011

У меня есть строки A função, Ãugent, в которых мне нужно заменить символы, такие как ç, ã, Ã, на пустые строки.

Как мне сопоставить только те, которые не ASCIIсимволы?

я использую функцию

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;
    }

, но она не работает должным образом ... какое улучшение необходимо ... здесь у меня есть еще одна проблема в том, что окончательная строка получаетзаменяется пробелом, который создает дополнительный пробел в строке.

Ответы [ 5 ]

143 голосов
/ 15 декабря 2011

Это будет искать и заменять все не ASCII буквы:

String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");
65 голосов
/ 22 июля 2013

Ответ FailedDev хорош, но может быть улучшен.Если вы хотите сохранить эквиваленты ascii, вам нужно сначала нормализовать:

String subjectString = "öäü";
subjectString = Normalizer.normalize(subjectString, Normalizer.Form.NFD);
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");

=> will produce "oau"

Таким образом, такие символы, как «öäü», будут сопоставлены с «oau», что по крайней мере сохранит некоторую информацию.Без нормализации результирующая строка будет пустой.

19 голосов
/ 15 декабря 2011

Это будет решение Unicode

String s = "A função, Ãugent";
String r = s.replaceAll("\\P{InBasic_Latin}", "");

\p{InBasic_Latin} - это блок Unicode, который содержит все буквы в диапазоне Unicode U + 0000..U + 007F (см. регулярное выражение.info )

\P{InBasic_Latin} является отрицанием \p{InBasic_Latin}

2 голосов
/ 15 декабря 2011

Вы можете попробовать что-то вроде этого. Диапазон специальных символов для алфавитов начинается с 192, поэтому вы можете избежать таких символов в результате.

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());
0 голосов
/ 26 сентября 2017

Или вы можете использовать приведенную ниже функцию для удаления не-ascii символа из строки. Вы узнаете внутреннюю работу.

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

    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...