Заменить управляющие символы Юникода
Мне нужно заменить все специальные управляющие символы в строке в 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 ссылки
java.util.regex.Pattern
- регулярные выражения.info/Character Class
Примеры
Вот пример вычитания:
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
законны; все остальное незаконно.