Tomcat中的URLEncoder,使用十六进制来编码

本文详细介绍了Java中URLEncoder类的实现原理与使用方法,包括十六进制基本字符集、安全字符集构建以及字符串编码流程。通过实例演示了如何自定义URL编码规则,对于理解Java网络编程和安全编码具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package org.apache.catalina.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.BitSet;

public class URLEncoder {
//十六进制基本字符
 protected static final char[] hexadecimal =
    {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
     'A', 'B', 'C', 'D', 'E', 'F'};

    //Array containing the safe characters set. 
   //BitSet 实现了一个按需增长的位向量
    protected BitSet safeCharacters = new BitSet(256);

    public URLEncoder() {
        for (char i = 'a'; i <= 'z'; i++) {
            addSafeCharacter(i);
        }
        for (char i = 'A'; i <= 'Z'; i++) {
            addSafeCharacter(i);
        }
        for (char i = '0'; i <= '9'; i++) {
            addSafeCharacter(i);
        }
    }

    public void addSafeCharacter( char c ) {
        safeCharacters.set( c );
    }

    public String encode( String path ) {
        int maxBytesPerChar = 10;
        StringBuilder rewrittenPath = new StringBuilder(path.length());
        //使用OutputStreamReader组装ByteArrayOutputStream将字符写入到二进制数组中
        ByteArrayOutputStream buf = new ByteArrayOutputStream(maxBytesPerChar);
        OutputStreamWriter writer = null;
        try {
            writer = new OutputStreamWriter(buf, "UTF8");
        } catch (Exception e) {
            e.printStackTrace();
            writer = new OutputStreamWriter(buf);
        }

        for (int i = 0; i < path.length(); i++) {
            int c = path.charAt(i);
            if (safeCharacters.get(c)) {
                rewrittenPath.append((char)c);
            } else {
                // convert to external encoding before hex conversion
                try {
                    writer.write((char)c);
                    writer.flush();
                } catch(IOException e) {
                    buf.reset();
                    continue;
                }
                byte[] ba = buf.toByteArray();
                for (int j = 0; j < ba.length; j++) {
                    // Converting each byte in the buffer
                    byte toEncode = ba[j];
                    rewrittenPath.append('%');
                   //编码规则
                    int low = toEncode & 0x0f;
                    int high = (toEncode & 0xf0) >> 4;
                    rewrittenPath.append(hexadecimal[high]);
                    rewrittenPath.append(hexadecimal[low]);
                }
                buf.reset();
            }
        }
        return rewrittenPath.toString();
    }
}


在 Android 中,使用 URLEncoder 对数据进行编码是一种常见的做法,尤其是在需要将参数附加到 URL 中时。URLEncoder 类位于 `java.net` 包中,提供了一种简单的方法来对字符串进行编码,使其适合作为 URL 的一部分。 以下是如何在 Android 中使用 URLEncoder 对数据进行编码的步骤: 1. **导入必要的包**: 首先,确保你的项目中导入了 `java.net.URLEncoder` 包。 2. **获取待编码的字符串**: 确定你想要编码的字符串。这通常是用户输入或程序生成的数据。 3. **调用 `encode` 方法**: 使用 `URLEncoder.encode(String s, String enc)` 方法对字符串进行编码。第一个参数是要编码的字符串,第二个参数是字符编码格式(如 "UTF-8")。 4. **处理异常**: 由于编码过程中可能会抛出 `UnsupportedEncodingException`,你需要适当地处理这个异常。 5. **使用编码后的字符串**: 将编码后的字符串用于构建 URL 或其他需要编码的场景。 例如,如果你想要对一个名为 "name" 的参数进行编码,并将其值设为 "John Doe",你可以这样做: ```java import java.net.URLEncoder; import java.io.UnsupportedEncodingException; public class Main { public static void main(String[] args) { String name = "John Doe"; try { String encodedName = URLEncoder.encode(name, "UTF-8"); System.out.println("Encoded name: " + encodedName); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } ``` 在这个例子中,"John Doe" 被编码为 "John+Doe",其中空格被替换为加号(+),这是 URL 编码的标准方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值