Заменить управляющие символы Юникода

Мне нужно заменить все специальные управляющие символы в строке в 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

1 ответ

Решение

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

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