替换Unicode控制字符

我需要在Java中替换字符串中的所有特殊控制字符。

我想问谷歌地图API v3,谷歌似乎并不喜欢这些字符。

示例: http : //www.google.com/maps/api/geocode/json?sendor = false&address = NEWS%20YO​​RK%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为此创建了一个网页:

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

如果要删除Other / Control Unicode类别中的所有字符,可以执行以下操作:

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

请注意,这实际上从字符串中删除了( '\u008f' )其中的'\u008f'字符,而不是转义forms的"%8F"字符串。

如果一个Unicode块/类别没有很好地捕获黑名单,那么Java确实有一个强大的字符类算术,它可以使用交集,减法等。 或者,您也可以使用否定的白名单方法,即不是明确指定哪些字符是非法的,而是指定合法的内容,然后其他所有内容都变为非法。

API链接

  • java.util.regex.Pattern
  • regular-expressions.info/Character Class

例子

这是一个减法示例:

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

[…]是一个角色类 。 类似[aeiou]东西与任何一个小写元音相匹配。 [^…]是一个否定的字符类。 [^aeiou]匹配除小写元音之外的任何内容

[az&&[^aeiou]]匹配[aeiou]减去的[aeiou] [az] [aeiou] ,即所有小写辅音。

下一个示例显示了否定的白名单方法:

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

只有小写字母az才合法; 其他一切都是非法的。