问题描述

最近在优化钉钉告警消息的功能,需要将url由后端返回,markdown文本显示为链接的形式,当url参数包含中文,或者参数值包含中文或空格时,需要对参数或参数值进行urlencode。

但是当包含空格时,发现单纯使用URLEncoder.encode(url, “UTF-8”)是不够的。

其实际表现与js中的encodeURLComponent不同。对于空格encode后为”+”,而js中为 %20

Java中实现js中的encodeURLComponent

使用 utf-8 encode后,需要对特定字符做替换

https://stackoverflow.com/questions/607176/java-equivalent-to-javascripts-encodeuricomponent-that-produces-identical-outpu

https://blog.csdn.net/wangweiren_get/article/details/82585629

  1. public static String encodeURIComponent(String s) {
  2. String result = null;
  3. try {
  4. result = URLEncoder.encode(s, "UTF-8")
  5. .replaceAll("\\+", "%20")
  6. .replaceAll("\\%21", "!")
  7. .replaceAll("\\%27", "'")
  8. .replaceAll("\\%28", "(")
  9. .replaceAll("\\%29", ")")
  10. .replaceAll("\\%7E", "~");
  11. }
  12. // This exception should never occur.
  13. catch (UnsupportedEncodingException e) {
  14. result = s;
  15. }
  16. return result;
  17. }