今天要实现的一个功能是在页面上上传文件到后台,文件是txt格式,每行是一个url,后台读取后,对路径中的中文进行url编码

如下是我的代码:

Pattern chinesePattern = Pattern.compile("[\\u4e00-\\u9fa5]+");MultipartFile file = null;try {boolean isMultipart = ServletFileUpload.isMultipartContent(request);if (isMultipart) {MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;file = multipartRequest.getFile("file");String line = null;Set<String> urlOrNameSet = new HashSet<>();BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream(), "GB18030"));//这里其实默认也是用GB18030编码读入while ((line = reader.readLine()) != null) {if(StringUtils.isNotBlank(line)) {line = line.trim();Matcher matcher = chinesePattern.matcher(line);while (matcher.find()) {line = line.replaceAll(matcher.group(), URLEncoder.encode(matcher.group());}urlOrNameSet.add(line);}}}} catch (Exception e) {logger.error("batch import fail: {}", e);}

但是发现一个诡异的问题,编码后的路径,是错误的,根本访问不了,见鬼,于是我做了一个单元测试:

@Testpublic void testUrl() throws Exception {String url = "https://baike.baidu.com/item/乒乓球台/2565939";Pattern chinesePattern = Pattern.compile("[\\u4e00-\\u9fa5]+");Matcher matcher = chinesePattern.matcher(url);while (matcher.find()) {url = url.replaceAll(matcher.group(), URLEncoder.encode(matcher.group()));}System.out.println(url);}

可以看到代码和上面是一模一样的,但是这种方式编码后的路径就可以正常访问,而且的确可以看到,上面编码后的路径和这里单元测试编码后的路径不一样

真是见鬼,代码明明一样,为什么结果不一样,首先想到的应该是编码问题,可是这两个地方的url都是UTF-8的,所以url的编码是一致的,问题不在url这里

最后我想到是否可能是在URLEncoder.encode的过程中出了问题,于是我先进去源码可以看到:

@Deprecatedpublic static String encode(String s) {String str = null;try {str = encode(s, dfltEncName);} catch (UnsupportedEncodingException e) {// The system should always have the platform default}return str;}

可以看到这是个过时的方法,当然这不是重点,重点是这里有一个默认编码dfltEncName,于是我debug看了下,单元测试的地方,这里的默认编码是UTF-8,但是我的项目里面这里居然是GBK,于是我改成了如下代码:

line = line.replaceAll(matcher.group(), URLEncoder.encode(matcher.group(), "UTF-8"));

问题终于得到了解决

URLEncoder.encode的默认编码问题相关推荐

  1. java encoder 编码_URLEncoder.encode的默认编码问题

    今天要实现的一个功能是在页面上上传文件到后台,文件是txt格式,每行是一个url,后台读取后,对路径中的中文进行url编码 如下是我的代码: Pattern chinesePattern = Patt ...

  2. 关于java.net.URLEncoder.encode编码问题

    Q:java.net.URLEncoder.encode里的编码和什么有关的? A:使用urlencoder编码会将中文变成你在浏览器地址栏看到的%XX形式,至于选择哪种enc编码跟你jvm的defa ...

  3. URLDecoder.decode与URLEncoder.encode

    URLEncoder.encode: 这是编码: 如: 1.要把文本框中中的内容存到cookie里面,由于cookie是ASCLL编码方式,所以要把文本框中的内容编码到ascll,便于存到cookie ...

  4. URLEncoder.encode(str,编码) new URLDecoder().decode(str,编码)

    try   {                                 String enUft = URLEncoder.encode("广东省福利彩票开奖信息网", & ...

  5. java.net.urlencoder_使用java.net.URLEncoder.encode()可以对要传递的中文进行编码

    使用java.net.URLEncoder.encode()可以对要传递的中文进行编码 a.在传参数之前先把参数进行转码:java.net.URLEncoder.encode(param);取值时用语 ...

  6. 中文乱码在java中URLEncoder.encode方法要调用两次解决

    2019独角兽企业重金招聘Python工程师标准>>> 因为在jsp中对中文进行了编码的时候用的是UTF-8的编码方式,而在servlet中调用request.getParamete ...

  7. 关于URLEncoder.encode(str) 和 URLEncoder.encode(str,enc)

    URLEncoder.encode(str) 是一个过期方法,编码默认的是系统编码,在使用这个方法的要注意,代码运行环境的编码格式是不是,和你项目是否一致 URLEncoder.encode(str, ...

  8. 为什么java的web开发中URLEncoder.encode方法要为什么要调用两次

    一: 我们先看2个编码的情况 String name=java.net.URLEncoder.encode("测试", "UTF-8");           ...

  9. python unicode编码转换中文_python unicode转中文及转换默认编码

    一. 在爬虫抓取网页信息时常需要将类似"\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8"转换为中文,实际上这是unicode的中文编码.可 ...

最新文章

  1. ListView添加项目带序列
  2. GTK+开发环境搭建(Centos+Netbeans)
  3. [C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++
  4. [译]Profile and debug your ASP.NET MVC app with Glimpse
  5. cpu相关信息(进程、线程、核...)
  6. Atitit sumdoc index 2019 v6 t56 .docx Atitit sumdoc index s99 目录 1. Zip ver 1 1.1. C:\Users\Adminis
  7. vue项目-jQuery中Nicescroll滚动条插件的用法
  8. vue代码如何跟后端代码结合_阿里云服务器优惠购买教程,可获得800元代金券,云服务器仅需82元/年_学云网...
  9. Radius协议简单介绍
  10. 微信小程序分享朋友圈API限制问题
  11. PDF查看器Spire.PDFViewer 教程:如何在一个网页中查看多个PDF文件
  12. W806+ST7735R+tftLCD程序开发
  13. 恕我直言:你可能一直用错了 kafka 的重试机制
  14. elasticsearch篇之mapping
  15. 家谱宗族网站源码_家谱管理系统(源代码)
  16. 布袋除尘器过滤风速多少_袋式除尘器过滤风速一般多大
  17. linux 查看mapper 路径,Linux系统/dev/mapper目录
  18. 有苦有乐的算法 --- 图的深度优先遍历
  19. 数据结构与算法看这篇就够了
  20. RabbitMQ初步到精通-第四章-RabbitMQ工作模式-Routing

热门文章

  1. Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。...
  2. JDK安装、java环境配置
  3. javaWeb项目之图书管理系统(附视频讲解)
  4. 高级定价基本概念理解
  5. ActionBar返回键图标怎么搞小点?
  6. ie6、ie7下overflow失效
  7. 【Linux】Linux用户和权限管理
  8. 360云台智能看家存储在哪_新品360智能摄像机云台变焦版,惊喜改变可不止一点点...
  9. Navicat连接虚拟机Linux的数据库时,出现错误代码“10038”
  10. gorm bool 指针 不更新_百度网盘不限速BaiduPCS-Go for Mac