Java - удаление странных символов из строки

Как удалить странные и нежелательные символы Юникода (например, черный бриллиант с вопросительным знаком) из строки?

Обновлено:

Скажите, пожалуйста, строку символов Unicode или регулярное выражение, которые соответствуют "черному алмазу с вопросительным знаком в нем".

Ответ 1

Черный бриллиант с вопросительным знаком не является символом юникода - это заполнитель для символа, который ваш шрифт не может отобразить. Если в строке есть символ, который не находится в шрифте, который вы используете для отображения этой строки, вы увидите местозаполнитель. Это определяется как U + FFFD:. Его внешний вид зависит от используемого вами шрифта.

Вы можете использовать java.text.normalizer, чтобы удалить символы Unicode, которые не находятся в "нормальном" наборе символов ASCII.

Ответ 2

Вы можете использовать String.replaceAll("[my-list-of-strange-and-unwanted-chars]","")

Нет Character.isStrangeAndUnWanted(), вы должны определить, что хотите.

Если вы хотите удалить управляющие символы, вы можете сделать

String str = "\u0000\u001f hi \n";
str = str.replaceAll("[\u0000-\u001f]", "");

выводит hi (сохраняет пробел).

EDIT Если вы хотите узнать юникод любого 16-битного символа, вы можете сделать

int num = string.charAt(n);
System.out.println(num);

Ответ 3

Джастин Томас был близок, но это, вероятно, ближе к тому, что вы ищете:

String nonStrange = strangeString.replaceAll("\\p{Cntrl}", ""); 

Селектор\p {Cntrl} выбирает " Управляющий символ: [\ x00-\x1F\x7F]."

Ответ 4

Чтобы удалить нелатинские символы из строки, я использую следующий код:

String s = "小米体验版 latin string 01234567890";
s = s.replaceAll("[^\\x00-\\x7F]", "");

Выходная строка будет:    "латинская строка 01234567890"

Ответ 5

Используйте String.replaceAll():

String clean = "♠clean".replaceAll('♠', '');

Ответ 6

Поместите символы, которые вы хотите избавиться в списке массивов, затем выполните итерацию по массиву с помощью метода replaceAll:

String str = "Some text with unicode [email protected]#$";
ArrayList<String> badChar = new ArrayList<String>();
badChar= ['@', '~','!']; //modify this to contain the unicodes

for (String s : badChar) {
   String resultStr = str.replaceAll(s, str);
}

вы получите очищенную строку "resultStr" не проверили это, но по строкам.

Ответ 7

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

эффективно разрешил его с помощью

public String getstringfromclob(Clob cl)
{
    StringWriter write = new StringWriter();
    try{
        Reader read  = cl.getCharacterStream();     
    int c = -1;
    while ((c = read.read()) != -1)
    {
        write.write(c);
    }
    write.flush();
    }catch(Exception ec)
    {
        ec.printStackTrace();
    }
    return write.toString();

}

Ответ 8

фильтр английский, китайский, номер и пунктуация

str = str.replaceAll("[^!-~\\u20000-\\uFE1F\\uFF00-\\uFFEF]", "");

Ответ 9

Вы не можете, потому что строки неизменяемы.

Возможно, однако, создать новую строку, в которой удалены ненужные символы. Найдите строку # replaceAll().