替换Unicode控制字符

时间:2010-08-09 09:48:38

标签: java regex google-maps unicode character-properties

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

我想询问Google maps API v3,Google似乎并不喜欢这些字符。

示例:http://www.google.com/maps/api/geocode/json?sensor=false&address=NEW%20YORK%C2%8F

此网址包含以下字符: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

1 个答案:

答案 0 :(得分:10)

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

[…]character class。像[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才合法;其他一切都是非法的。