7

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

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

示例: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 不喜欢哪些确切的字符列表吗?

编辑:谷歌为此创建了一个网页:

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

4

1 回答 1

13

如果要删除 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__!!

[…]一个字符类。like[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是合法的;其他一切都是非法的。

于 2010-08-09T10:39:51.660 回答