有个字符转码的问题,想不明白,问问大家,
是关于从服务器下载文件内容和文件名的。首先,已经通过
SetCharacterEncodingFilter
设置字符编码为utf8。接着,
String fileName = request.getParameter("fileName");
这时,fileName取到的值为“测试文件名”,编码格式为utf8;
然后,进行转码(问题:为什么要从gbk转成8859_1,而不是从utf8转成8859_1?)
String strFileName = new String(fileName.getBytes("gbk"), "8859_1");再设置文件下载的默认文件名
response.addHeader("Content-Disposition", "attachment;filename=" + strFileName);
(这时,在浏览器上提示保存文件的对话框上,显示的文件名是正常的,如果从utf8转的话,就显示不正常了,为什么?)然后,再输出内容
response.getOutputStream().write(fileName.getBytes());
最终输出的文件的内容是以utf8格式保存的,并且显示正常。我的操作系统是Win2k pro 简体
jdk 1.4
tomcat 5.0

解决方案 »

  1.   

    你怎么能知道 “这时,fileName取到的值为“测试文件名”,编码格式为utf8;”??
      

  2.   

    从这里首先,已经通过
    SetCharacterEncodingFilter
    设置字符编码为utf8。和这里response.getOutputStream().write(fileName.getBytes());
    最终输出的文件的内容是以utf8格式保存的,并且显示正常。都可以知道是utf8的啊
      

  3.   

    顶  /**
       * 编码是否有效
       * @param text
       * @return
       */
      private boolean Utf8codeCheck(String text){
        String sign = "";
        if (text.startsWith("%e"))
          for (int i = 0, p = 0; p != -1; i++) {
            p = text.indexOf("%", p);
            if (p != -1)
              p++;
            sign += p;
          }
        return sign.equals("147-1");
      }  /**
       * 是否Utf8Url编码
       * @param text
       * @return
       */
      public boolean isUtf8Url(String text) {
        text = text.toLowerCase();
        int p = text.indexOf("%");
        if (p != -1 && text.length() - p > 9) {
          text = text.substring(p, p + 9);
        }
        return Utf8codeCheck(text);
      }
      

  4.   

    8859_1是最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "?D"。反之,如果将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。
      

  5.   

    分析一下流程:
    1.SetCharacterEncodingFilter设置字符编码为utf8。就是告诉服务器在处理InputStream和
      OutputStream时处理消息体时以UTF-8编码格式进行存储.也就是说以post提交的信息,
      SetCharacterEncoding有效,而对以get方式提交是无效的.
    2.String fileName = request.getParameter("fileName");这句,把"测试文件名"这个字符串以
      utf-8格式存储为字符串fileName.
    3.String strFileName = new String(fileName.getBytes("gbk"), "iso8859-1");分两步,
      byte[] b = fileName.getBytes("gbk");把字符串fileName以gbk字符编码解析为byte数组b.
      String strFileName = new String(b,"iso8859-1");把字节数组b以iso8859-1字符编码解析,并
      生成字符串strFileName(unicode字符编码,java内部以unincode处理字符串).
    4.response.addHeader("Content-Disposition", "attachment;filename=" + strFileName);
      addHeader方法第二个参数会被服务器以iso8859-1字符编码进行解析,也就是解析strFileName
      (unicode字符编码的)为字节数组并存入OutputStream中,发送给客户端,客户端收到后以系统默
      认的字符编码格式解析头信息(处理OutputStream中的头信息和消息体是不一样的).
      综上可见整个过程:UTF-8-->GBK-->ISO8859-1-->unicode-->ISO8859-1(服务器默认)-->GBK(客
      户端默认)并显示,从这个转换过程可以回答lz的两个为什么了!
    5.response.getOutputStream().write(fileName.getBytes());
      最终输出的文件的内容是以utf8格式保存的,并且显示正常。
      此过程在response.getOutputStream()中操作,使用的都是UTF-8编码!所以没有问题!个人的一点分析,希望对大家能有所帮助,错误或不足的地方,请楼下的兄弟指正!