Заменить управляющие символы Юникода - PullRequest
6 голосов
/ 09 августа 2010

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

Я хочу спросить API карт Google 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

1 Ответ

11 голосов
/ 09 августа 2010

Если вы хотите удалить все символы в категории Другое / Управляющий Unicode, вы можете сделать что-то вроде этого:

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

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

Если черный список не захвачен одним блоком / категорией 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; все остальное незаконно.

...