zoukankan      html  css  js  c++  java
  • 转载:**URLEncoder会把所有的符号都进行转换**原名(Tomcat6与Java下载文件编码问题 )

    转载网址:http://mzywqwq.blog.163.com/blog/static/958701220126355451960/

    关于Java编码可以参考这篇文章: http://andyhu1007.iteye.com/blog/311583 

    Tomcat6默认是使用iso8859-1编码,浏览器一般默认使用UTF-8编码,所以在浏览器里查看中文名称的文件时会显示乱码,可以修改server.xml的配置,如下:

    <Connectorport="8080"protocol="HTTP/1.1"
    connectionTimeout="20000"
    URIEncoding="UTF-8"
    redirectPort="8443"/>

    主要是加入 URIEncoding="UTF-8" 这一句,可以修改Tomcat使用的编码。
    Java端下载的时候需要把中文路径跟文件名转换成URL格式,即类似%E5%95%8A.txt的形式,可以利用URLEncoder来编码,但是URLEncoder会把所有的符号都进行转换,包括路径分割符'/'和':',这就需要自己处理一下字符串,跳过特殊符号,下面是Java的转换及下载代码,可以支持中文:

    /**
    * 向指定URL下载文件
    * @param url 发送请求的URL,包含要下载的文件名
    * @param savePath 要保存的本地路径
    */
    publicstaticvoid downloadFile(String url,String saveFile)
    {
    try
    {
    URL realUrl =new URL(encodeUrl(url,"utf-8"));
    BufferedInputStreamin=newBufferedInputStream(realUrl.openStream());
    File newFile =newFile(saveFile);
    BufferedOutputStreamout=newBufferedOutputStream(newFileOutputStream(newFile));
    byte[] buf =newbyte[2048];
    int length =in.read(buf);
    while(length !=-1)
    {
    out.write(buf,0, length);
    length =in.read(buf);
    }
    in.close();
    out.close();
    }
    catch(Exception e)
    {
    System.out.println("GET error!"+ e);
    e.printStackTrace();
    }
    }

    /**
    * 将链接地址转换成网络路径,否则不支持中文
    * @param str 要编码的链接
    * @param encoding 编码格式
    * @return 转换后的字符串
    */
    publicstaticString encodeUrl(String str,String encoding)
    {
    try
    {
    StringBuilder sb =newStringBuilder();
    int start =0;
    for(int i =0; i < str.length(); i++)
    {
    if(str.charAt(i)=='/'|| str.charAt(i)==':')//URLEncoder会转换所有字符,此处跳过不需要转换的字符
    {
    sb.append(URLEncoder.encode(str.substring(start, i),encoding));
    sb.append(str.charAt(i));
    start = i +1;
    }
    }
    if(start < str.length())
    sb.append(URLEncoder.encode(str.substring(start), encoding));
    return sb.toString().replace("+","%20");//空格被转换成"+",实际需要转换成"%20"
    }
    catch(UnsupportedEncodingException e)
    {
    e.printStackTrace();
    }
    returnnull;
    }

  • 相关阅读:
    Maven安装与配置
    win10更新后程序路径盘符变成*星号解决方法
    谈谈 CSS 关键字 initial、inherit 和 unset
    用 async/await 来处理异步
    Vuex
    HTML5新特性之文件和二进制数据的操作 Blob对象
    vue中class和内联style绑定
    Petya and Staircases CF212div.2B
    CF#212 Two Semiknights Meet
    HDU1423最长上升公共子序列
  • 原文地址:https://www.cnblogs.com/lraa/p/3094571.html
Copyright © 2011-2022 走看看