2012-06-13 3 views
11

я получить пользовательский ввод включая юникод символы, такие какJava символов удаления Юникода

\xc2d 
\xa0 
\xe7 
\xc3\ufffdd 
\xc3\ufffdd 
\xc2\xa0 
\xc3\xa7 
\xa0\xa0 

, например:

email : [email protected]\xa0\xa0 
street : 123 Main St.\xc2\xa0 

желаемый результат:

email : [email protected] 
    street : 123 Main St. 

Что такое лучший способ их устранения используя Java?

Update: Я попытался следующие, но не похоже на работу

public static void main(String args[]) throws UnsupportedEncodingException { 
     String s = "[email protected]\\xe9.com"; 
     String email = "[email protected]\\xa0\\xa0"; 

     System.out.println(s.replaceAll("\\P{Print}", "")); 
     System.out.println(email.replaceAll("\\P{Print}", "")); 
    } 

Выход

[email protected]\xe9.com 
[email protected]\xa0\xa0 
+0

Почему вы хотите удалить их? – jtahlborn

+1

@jtahlborn, Mongo не может сериализовать эти значения – daydreamer

ответ

27

Ваши требования не ясны. Все символы в Java String являются символами Юникода, поэтому, если вы их удалите, вы останетесь с пустой строкой. Я предполагаю, что вы имеете в виду, что хотите удалить любые символы, отличные от ASCII, непечатаемые.

String clean = str.replaceAll("\\P{Print}", ""); 

Здесь \p{Print}represents a POSIX character class для печатаемых символов ASCII, в то время как \P{Print} является дополнением к этому классу. С этим выражением все символы, которые являются , а не печатаемыми ASCII, заменяются пустой строкой. (Дополнительный обратный слэш, потому что \ начинает управляющую последовательность в строковых литералов.)


По-видимому, все вводимые символы фактически ASCII символы, которые представляют для печати кодировку непечатаемых или не-ASCII символов. У Mongo не должно быть никаких проблем с этими строками, потому что они содержат только простые печатные символы ASCII.

Все это звучит немного подозрительно для меня. Я считаю, что данные действительно содержат непечатаемые и не-ASCII-символы, а другой компонент (например, фреймворк) заменяет их на печатное представление. В ваших простых тестах вы не можете перевести печатное представление обратно в исходную строку, поэтому вы ошибочно полагаете, что первое регулярное выражение не работает.

Это моя догадка, но если я неправильно понял ситуацию, и вам действительно нужно вырезать буквальные \xHH экраны, вы можете сделать это со следующим регулярным выражением.

String clean = str.replaceAll("\\\\x\\p{XDigit}{2}", ""); 

Документация API для Pattern класса делает хорошую работу со списком всех синтаксиса, поддерживаемых библиотекой регулярных выражений в Java. Для более подробной информации о том, что все синтаксис означает, я нашел Regular-Expressions.info site очень полезным.

+0

это не работает. Возможно, я делаю что-то неправильное, но не работает – daydreamer

+1

@daydreamer Можете ли вы предоставить [SSCCE] (http://sscce.org/), который показывает, что не работает? – erickson

+0

public static void main (String args []) throws UnsupportedEncodingException { String s = "abc @ gmail \\ xe9.com"; String email = "[email protected] \\ xa0 \\ xa0"; System.out.println (s.replaceAll ("\\ P {Print}", "")); System.out.println (email.replaceAll ("\\ P {Print}", "")); } out put - abc @ gmail \ xe9.com [email protected] \ xa0 \ xa0 – daydreamer

2

Вы можете попробовать этот код:

public String cleanInvalidCharacters(String in) { 
    StringBuilder out = new StringBuilder(); 
    char current; 
    if (in == null || ("".equals(in))) { 
     return ""; 
    } 
    for (int i = 0; i < in.length(); i++) { 
     current = in.charAt(i); 
     if ((current == 0x9) 
       || (current == 0xA) 
       || (current == 0xD) 
       || ((current >= 0x20) && (current <= 0xD7FF)) 
       || ((current >= 0xE000) && (current <= 0xFFFD)) 
       || ((current >= 0x10000) && (current <= 0x10FFFF))) { 
      out.append(current); 
     } 

    } 
    return out.toString().replaceAll("\\s", " "); 
} 

Он работает для меня, чтобы удалить недопустимые символы из String.

+3

Это много волшебных чисел. Как насчет выделения этих предложений (особенно диапазонов) в точно названные локальные переменные? –

10

С Google Guava «s CharMatcher, вы можете удалить любые non-printable символы, а затем сохранить все символы ASCII (сбрасывают любые акценты), как это:

String printable = CharMatcher.INVISIBLE.removeFrom(input); 
String clean = CharMatcher.ASCII.retainFrom(printable); 

Не уверен, что это то, что вы действительно хотите, но он удаляет что-нибудь выраженные как escape-последовательности в данных образца вашего вопроса.

+3

примечание, НЕВИДИМЫЕ удаленные пробелы, которые я нахожу странными, так как он действительно «печатается». –

7

Я знаю, что это может быть поздно, но на будущее:

String clean = str.replaceAll("\\P{Print}", ""); 

Удаляет все не печатаемые символы, но включает в себя \n (строки), \t (вкладка) и \r (возврат каретки), а иногда хотите сохранить эти персонажи.

Для этого использование проблема перевернутой логики:

String clean = str.replaceAll("[^\\n\\r\\t\\p{Print}]", ""); 
+0

Упрощенный для его особой полезности в манго-землях, чтобы удержать оболочку от извергания нелепого количества закодированных вещей, не связанных с ascii (монго действительно действительно предпочитает utf-8 если вы хотите, чтобы все было легко) –

+0

Получил ошибку: незаконный символ эвакуации String clean = str.replaceAll ("[^ \ n \ r \ t \ p {Print}]", ""); , \ p должно быть \ P –

0

Input => "Это \ u7279 текст \ u7279 , что мне нужно" Output => "Этот текст, что я need "

Если вы пытаетесь удалить символы Unicode из строки, как указано выше, этот код будет работать

Pattern unicodeCharsPattern = Pattern.compile("\\\\u(\\p{XDigit}{4})"); 
Matcher unicodeMatcher = unicodeChars.matcher(data); 
String cleanData = null; 
if (unicodeMatcher.find()) { 
    cleanData = unicodeMatcher.replaceAll(""); 
} 
Смежные вопросы