首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

URLEncoder 僅編碼中文字符工具類實現

     編輯:Java 相關知識

標準 URLEncoder.encode() 會編碼所有非 ASCII 字符,有時只需編碼 URL 中的中文部分(如檔名),保留英文、數字、符號不變。本工具類使用正則提取中文片段單獨編碼,再拼回原字串。

核心代碼


package log;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class URLEncoderHZ {
    private static final String ZH_PATTERN = "[\u4e00-\u9fa5]+"; // 中文 Unicode 範圍

    public static void main(String[] args) throws Exception {
        String str = "https://192.168.1.1:8080/resources/電話.xls";
        System.out.println(encode(str, "UTF-8"));
        // 輸出: https://192.168.1.1:8080/resources/%E7%94%B5%E8%AF%9D.xls
    }

    public static String encode(String str, String charset) throws UnsupportedEncodingException {
        Pattern p = Pattern.compile(ZH_PATTERN);
        Matcher m = p.matcher(str);
        StringBuffer b = new StringBuffer();
        while (m.find()) {
            m.appendReplacement(b, URLEncoder.encode(m.group(0), charset));
        }
        m.appendTail(b);
        return b.toString();
    }
}

原理解析

  1. 正則 [\u4e00-\u9fa5]+ 匹配連續中文字符(基本漢字區)
  2. Matcher.appendReplacement() 將每個匹配片段替換為 URLEncoder.encode() 結果
  3. appendTail() 處理最後未匹配部分
  4. StringBuffer 線程安全,單執行緒可用 StringBuilder 替換

適用場景

  • URL 路徑包含中文檔名/參數,需符合 RFC 3986
  • 避免過度編碼導致 URL 可讀性下降或後端解析異常
  • 可擴展正則支援日文、韓文等其他 Unicode 區塊

注意事項

  • 僅處理中文,其他保留字符(空格、#、? 等)不編碼,若需完整編碼請用標準 URLEncoder
  • 字符集建議統一使用 UTF-8
  • 大量字串處理時注意效能,可預編譯 Pattern
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved