標準 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();
}
}
[\u4e00-\u9fa5]+ 匹配連續中文字符(基本漢字區)Matcher.appendReplacement() 將每個匹配片段替換為 URLEncoder.encode() 結果appendTail() 處理最後未匹配部分StringBuffer 線程安全,單執行緒可用 StringBuilder 替換#、? 等)不編碼,若需完整編碼請用標準 URLEncoderUTF-8Pattern