【问题标题】:Is Uri.encode() in Android equivalent to encodeURIComponent() in Javascript?Android 中的 Uri.encode() 是否等同于 Javascript 中的 encodeURIComponent()?
【发布时间】:2015-07-20 08:30:18
【问题描述】:

我试图澄清 Java 的 URLEncoder.encode()、Javascript 的 encodeURI()encodeURIComponent() 和 Android 的 Uri.encode() 之间的区别。

看起来像这样:

  • 字母和数字
    • 每个人都保持
  • .-*_
    • 每个人都保持
  • !~'()
    • URLEncoder.encode() 编码,其他人保留
  • ,/?:@&=+$#
    • encodeURI() 保留,其他编码
  • 空间
    • +URLEncoder.encode()%20 为其他人

URLEncoder.encode()encodeURIComponent() 的行为似乎相同。我是对的,还是实际上它们也有一些区别?

【问题讨论】:

    标签: javascript java android encoding


    【解决方案1】:

    有趣的问题。我刚刚运行了一些代码来测试这个:

    Javascript encodeURIComponent

    encodeURIComponent 转义所有字符,除了:

    未转义:A-Z a-z 0-9 - _ . ! ~ * ' ( )

    代码:

    var sb = [];
    for (var i = 0; i < 256; ++i) {
        var encoded = encodeURIComponent(String.fromCharCode(i));
        if (encoded.indexOf('%') !== 0 && !encoded.match(/^[a-zA-Z0-9]+$/)) {
            sb.push(encoded);
        }
    }
    console.log(sb.join(' '));
    

    结果:

    ! ' ( ) * - . _ ~
    

    Javascript encodeURI

    encodeURI 转义所有字符,除了:

    未转义:A-Z a-z 0-9 - _ . ! ~ * ' ( ) ; , / ? : @ &amp; = + $ #

    代码:

    var sb = [];
    for (var i = 0; i < 256; ++i) {
        var encoded = encodeURI(String.fromCharCode(i));
        if (encoded.indexOf('%') !== 0 && !encoded.match(/^[a-zA-Z0-9]+$/)) {
            sb.push(encoded);
        }
    }
    console.log(sb.join(' '));
    

    结果:

    ! # $ & ' ( ) * + , - . / : ; = ? @ _ ~
    

    Java URLEncoder.encode

    使用特定的编码方案将字符串转换为 application/x-www-form-urlencoded 格式。此方法使用提供的编码方案来获取不安全字符的字节。

    代码:

    public static void main(String[] args) {
        try {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 256; ++i) {
                String encoded = URLEncoder.encode(String.valueOf((char) i), "UTF-8");
                if (!encoded.startsWith("%") && !encoded.matches("^[a-zA-Z0-9]+$")) {
                    sb.append(' ').append(encoded);
                }
            }
            System.out.println(sb.substring(1));
        } catch (Exception e) {}
    }
    

    结果:

    请注意,+ 实际上是一个空格。

    + * - . _
    

    Android Uri.encode

    使用 UTF-8 方案将给定字符串中的字符编码为“%”转义的八位字节。保留字母(“A-Z”、“a-z”)、数字(“0-9”)和未保留的字符(“_-!.~'()*”)不变。对所有其他字符进行编码。

    代码:

    try {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 256; ++i) {
            String encoded = Uri.encode(String.valueOf((char) i));
            if (!encoded.startsWith("%") && !encoded.matches("^[a-zA-Z0-9]+$")) {
                sb.append(' ').append(encoded);
            }
        }
        System.out.println(sb.substring(1));
    } catch (Exception e) {}
    

    结果:

    ! ' ( ) * - . _ ~
    

    【讨论】:

    • 所以encodeURIComponent()的等价物就是Android的Uri.encode()吧?
    • 是的,我在答案中添加了文档。它们都对除某个列表之外的所有字符进行编码,这对两个函数都是等效的。
    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 2010-10-11
    • 2017-10-14
    • 2021-10-22
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多