替换Unicode控制字符

Cyr*_*don 6 java regex unicode google-maps character-properties

我需要在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

所以我收到了一些数据,我需要对这些数据进行地理编码.我知道有些角色不会通过地理编码,但我不知道确切的列表.

我是不是能够找到的有关这个问题的任何文件,所以我认为谷歌不喜欢的字符的列表是这一个: http://www.fileformat.info/info/unicode/category/Cc/list.htm

是否有任何已构建的函数来摆脱这些字符,或者我必须构建一个新的,逐个替换?

或者有一个很好的正则表达式完成工作?

有人知道谷歌不喜欢哪个角色列表?

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

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

pol*_*nts 11

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

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

请注意,这实际上'\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__!!
Run Code Online (Sandbox Code Playgroud)

[…]是一个角色类.类似于[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__
Run Code Online (Sandbox Code Playgroud)

只有小写字母a-z是合法的; 其他一切都是非法的.

  • @BalusC:我不是 Unicode 专家,但我认为有记录:“可以使用可选前缀 `Is` 指定类别:`\p{L}` 和 `\p{IsL}` 都表示类别Unicode 字母。”。将“L”替换为“Cc”或任何其他类别名称。 (2认同)