Замена управляющих символов Unicode

Мне нужно заменить все специальные управляющие символы в строке на Java.

Я хочу спросить Google Maps API v3, и Google, похоже, не любит эти символы.

Пример: http://www.google.com/maps/api/geocode/json?sensor=false&address=NEW%20YORK%C2%8F

Этот URL-адрес содержит следующий символ: http://www.fileformat.info/info/unicode/char/008f/index.htm

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

Мне не удалось найти никакой документации по этой проблеме, поэтому я думаю, что список символов, которые не нравятся Google, выглядит следующим образом: http://www.fileformat.info/info/unicode/category/Cc/list.htm

Есть ли уже встроенная функция, чтобы избавиться от этих символов, или мне нужно создать новую с заменой по одному?

Или есть хорошее регулярное выражение для выполнения этой работы?

И кто-нибудь знает, какой точный список символов Google не любит?

Изменить: Google создал для этого веб-страницу:

https://developers.google.com/maps/documentation/webservices/?hl=fr#BuildingURLs


person Cyril Gandon    schedule 09.08.2010    source источник
comment
можете ли вы вручную избавиться от части %C2%8F вашего URL-адреса, чтобы проверить, действителен ли этот URL-адрес?   -  person Paul Jowett    schedule 09.08.2010
comment
Я могу вручную заменить все недопустимые символы. Проблема в том, что я не знаю весь список (и я не хочу проверять по одному), и я не хочу делать replaceAll для каждого недопустимого символа ни   -  person Cyril Gandon    schedule 09.08.2010


Ответы (1)


Если вы хотите удалить все символы в категории Other/Control Unicode, вы можете сделать что-то вроде этого:

    System.out.println(
        "a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
    ); // abcd

Обратите внимание, что это фактически удаляет (среди прочего) символ '\u008f' Unicode из строки, а не строку экранированной формы "%8F".

Если черный список не захвачен одним блоком/категорией Unicode, в Java есть мощная арифметика классов символов с пересечением, вычитанием и т. д., которую вы можете использовать. В качестве альтернативы вы также можете использовать отрицательный подход к белому списку, то есть вместо явного указания того, какие символы недопустимы, вы указываете, какие символы являются допустимыми, а все остальное становится недопустимым.

API-ссылки


Примеры

Вот пример вычитания:

    System.out.println(
        "regular expressions: now you have two problems!!"
            .replaceAll("[a-z&&[^aeiou]]", "_")
    );
    //   _e_u_a_ e___e__io__: _o_ _ou _a_e __o __o__e__!!

[…] – это класс символов. Что-то вроде [aeiou] соответствует одной из строчных гласных. [^…] — это инвертированный класс символов. [^aeiou] соответствует одному из любых, кроме гласных нижнего регистра.

[a-z&&[^aeiou]] соответствует [a-z] за вычетом [aeiou], то есть всех согласных нижнего регистра.

В следующем примере показан подход с отрицательным белым списком:

    System.out.println(
        "regular expressions: now you have two problems!!"
            .replaceAll("[^a-z]", "_")
    );
    //   regular_expressions__now_you_have_two_problems__

Допустимы только строчные буквы a-z; все остальное незаконно.

person polygenelubricants    schedule 09.08.2010
comment
Проблема в том, что я собираюсь использовать китайский, арабский, все возможные символы utf-8 :) Я попробую с p{Cc} !! - person Cyril Gandon; 09.08.2010
comment
@Scorpi0: это всего лишь примеры. Найдите любую категорию/блок Unicode, который вы хотите добавить в черный/белый список, и составьте регулярное выражение по своему усмотрению, используя показанные здесь элементы. - person polygenelubricants; 09.08.2010
comment
О, \p{Cc}, еще один недокументированный образное выражение. Хороший. Хорошо знать. - person BalusC; 09.08.2010
comment
@BalusC: я не эксперт по Unicode, но я думаю, что это задокументировано: категории могут быть указаны с необязательным префиксом Is: и \p{L}, и \p{IsL} обозначают категорию букв Unicode. . Замените L на Cc или любое другое имя категории. - person polygenelubricants; 09.08.2010
comment
С Oracle Java 1.6.0_29 в Linux \\p{Cc} у меня не работал, а \\p{C} работал (без строчной буквы c). Я не имею понятия почему - person gnobal; 16.12.2012