Как получить буквенно-цифровую строку из любой строки в Java?

Возможный дубликат:
ń ǹ ň ñ ṅ ņ ṇ ṋ ṉ ̈ ɲ ƞ>> -> n или Удалить диакритические знаки из символов Юникода
Как заменить специальные символы в строке?

Я хотел бы отформатировать некоторые строки, такие как "I>Télé" что-то вроде "itele", Идея состоит в том, что я хочу, чтобы моя строка была в нижнем регистре (сделано), без пробелов (сделано), без акцентов или специальных символов (например, >, <, /, %, ~, é, @, ï так далее).

Это нормально, чтобы удалить вхождения специальных символов, но я хочу сохранить буквы при удалении акцентов (как я сделал в моем примере). Вот то, что я сделал, но я не думаю, что хорошее решение - это заменить каждое é,è,ê,ë на "e", чем сделать это снова для "i","a" и т. Д., А затем удалить все особый персонаж...

String name ="I>télé" //example
String result = name.toLowerCase().replace(" ", "").replace("é","e").........;

Цель этого - предоставить правильное имя файла для ресурсов для приложения Android, поэтому, если у вас есть другие идеи, я возьму их!

3 ответа

Решение

Вы можете использовать java.text.Normalizer класс для преобразования вашего текста в обычные латинские символы, за которыми следуют диакритические знаки (акценты), где это возможно. Так, например, односимвольная строка "é" станет двухсимвольной строкой ['e', {COMBINING ACUTE ACCENT}],

После того, как вы это сделаете, ваша строка будет представлять собой комбинацию символов без акцента, модификаторов акцента и других специальных символов, которые вы упомянули. На этом этапе вы можете фильтровать символы в вашей строке, используя только белый список, чтобы сохранить то, что вы хотите (что может быть так просто, как [A-Za-z0-9] для регулярного выражения, в зависимости от того, что вы после).

Подход может выглядеть так:

String name ="I>télé"; //example
String normalized = Normalizer.normalize(name, Form.NFD);
String result = normalized.replaceAll("[^A-Za-z0-9]", "");

Вы можете сделать что-то вроде

String res = ""
for (char c : name.toCharArray()) {
    if (Character.isLetter(c) ||Character.isDigit(c))
        res += c    
}

//Normalize using the method below

http://blog.smartkey.co.uk/2009/10/how-to-strip-accents-from-strings-using-java-6/

public static String stripAccents(String s) {    
    s = Normalizer.normalize(s, Normalizer.Form.NFD);   
    s = s.replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
    return s;
}

Попробуйте использовать код ascii. может эта ссылка поможет

Другие вопросы по тегам