URLEncoder.encode的默认编码问题
今天要实现的一个功能是在页面上上传文件到后台,文件是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的默认编码问题相关推荐
- java encoder 编码_URLEncoder.encode的默认编码问题
今天要实现的一个功能是在页面上上传文件到后台,文件是txt格式,每行是一个url,后台读取后,对路径中的中文进行url编码 如下是我的代码: Pattern chinesePattern = Patt ...
- 关于java.net.URLEncoder.encode编码问题
Q:java.net.URLEncoder.encode里的编码和什么有关的? A:使用urlencoder编码会将中文变成你在浏览器地址栏看到的%XX形式,至于选择哪种enc编码跟你jvm的defa ...
- URLDecoder.decode与URLEncoder.encode
URLEncoder.encode: 这是编码: 如: 1.要把文本框中中的内容存到cookie里面,由于cookie是ASCLL编码方式,所以要把文本框中的内容编码到ascll,便于存到cookie ...
- URLEncoder.encode(str,编码) new URLDecoder().decode(str,编码)
try { String enUft = URLEncoder.encode("广东省福利彩票开奖信息网", & ...
- java.net.urlencoder_使用java.net.URLEncoder.encode()可以对要传递的中文进行编码
使用java.net.URLEncoder.encode()可以对要传递的中文进行编码 a.在传参数之前先把参数进行转码:java.net.URLEncoder.encode(param);取值时用语 ...
- 中文乱码在java中URLEncoder.encode方法要调用两次解决
2019独角兽企业重金招聘Python工程师标准>>> 因为在jsp中对中文进行了编码的时候用的是UTF-8的编码方式,而在servlet中调用request.getParamete ...
- 关于URLEncoder.encode(str) 和 URLEncoder.encode(str,enc)
URLEncoder.encode(str) 是一个过期方法,编码默认的是系统编码,在使用这个方法的要注意,代码运行环境的编码格式是不是,和你项目是否一致 URLEncoder.encode(str, ...
- 为什么java的web开发中URLEncoder.encode方法要为什么要调用两次
一: 我们先看2个编码的情况 String name=java.net.URLEncoder.encode("测试", "UTF-8"); ...
- python unicode编码转换中文_python unicode转中文及转换默认编码
一. 在爬虫抓取网页信息时常需要将类似"\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8"转换为中文,实际上这是unicode的中文编码.可 ...
最新文章
- ListView添加项目带序列
- GTK+开发环境搭建(Centos+Netbeans)
- [C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++
- [译]Profile and debug your ASP.NET MVC app with Glimpse
- cpu相关信息(进程、线程、核...)
- Atitit sumdoc index 2019 v6 t56 .docx Atitit sumdoc index s99 目录 1. Zip ver	1 1.1. C:\Users\Adminis
- vue项目-jQuery中Nicescroll滚动条插件的用法
- vue代码如何跟后端代码结合_阿里云服务器优惠购买教程,可获得800元代金券,云服务器仅需82元/年_学云网...
- Radius协议简单介绍
- 微信小程序分享朋友圈API限制问题
- PDF查看器Spire.PDFViewer 教程:如何在一个网页中查看多个PDF文件
- W806+ST7735R+tftLCD程序开发
- 恕我直言:你可能一直用错了 kafka 的重试机制
- elasticsearch篇之mapping
- 家谱宗族网站源码_家谱管理系统(源代码)
- 布袋除尘器过滤风速多少_袋式除尘器过滤风速一般多大
- linux 查看mapper 路径,Linux系统/dev/mapper目录
- 有苦有乐的算法 --- 图的深度优先遍历
- 数据结构与算法看这篇就够了
- RabbitMQ初步到精通-第四章-RabbitMQ工作模式-Routing
热门文章
- Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。...
- JDK安装、java环境配置
- javaWeb项目之图书管理系统(附视频讲解)
- 高级定价基本概念理解
- ActionBar返回键图标怎么搞小点?
- ie6、ie7下overflow失效
- 【Linux】Linux用户和权限管理
- 360云台智能看家存储在哪_新品360智能摄像机云台变焦版,惊喜改变可不止一点点...
- Navicat连接虚拟机Linux的数据库时,出现错误代码“10038”
- gorm bool 指针 不更新_百度网盘不限速BaiduPCS-Go for Mac