用gb2312就正常。换成utf-8就乱码(smartupload) 在线等

kaxudodo 2008-11-21 10:57:40
如果2个页面都是gb2312的话。得到的是正常的。
2个页面换成UTF-8就是乱码。哪位高手能告诉点细节。为什么这样?

<%@ page language="java"
pageEncoding="utf-8"%>
<%@page import="java.util.Date"%>
<%@page import="java.io.InputStream"%>
<%@page import="java.io.PrintWriter"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Properties"%>
<%@page import="java.util.Enumeration"%>
<%@page import="com.jspsmart.upload.SmartFiles"%>
<%@page import="com.jspsmart.upload.SmartUpload"%>
<%@page import="com.jspsmart.upload.SmartFile"%>
<%@ page import="com.util.*"%>
<%@page import="java.net.URLDecoder"%>
<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>文件上传</title>
<link rel="stylesheet" href="lucy.css" type="text/css">

<%
SmartUpload su = new SmartUpload();
String path = null;
String fileName="";
int flag=0;
try {
//request.setCharacterEncoding("utf-8");
//response.setContentType("text/html; charset=utf-8");
su.initialize(pageContext);
su.upload();
su.setMaxFileSize(10240);
su.setTotalMaxFileSize(20480);
su.setAllowedFilesList("doc,txt,jpg,gif,pdf");
su.setDeniedFilesList("exe,bat,com,htm,html");
if(path==null||path.equals("")){
com.tool.Tool tool = new com.tool.Tool();
path = tool.getPath();
}
for(int i=0; i<su.getFiles().getCount(); i++){
SmartFile file1 = su.getFiles().getFile(i);
if (file1.isMissing()){ //文件存在则进行判断
System.out.println("文件不存在");
continue;
}else{
String fileNameSN = file1.getFileName();
//fileNameSN = Util.convertChinese(fileNameSN);
//fileNameSN = new String(fileNameSN.getBytes("utf-8"),"gb2312");
//fileNameSN = new String(fileNameSN.getBytes("ISO-8859-1"),"utf-8");

System.out.println("fileNameSN:"+fileNameSN);
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMdHms");
String dateStr = dateFormat.format(date);
fileName = dateStr+"."+file1.getFileExt();
//System.out.println(path+fileName);
file1.saveAs(path+fileName,su.SAVE_VIRTUAL);
flag+=1;

String tarobj,fn,sn;
int fsize;
tarobj = Util.convertChinese(request.getParameter("tagobj"));
fn = fileName;
sn = fileNameSN;
//sn = String.format("%c",sn);
fsize=file1.getSize()/1024;
if (fsize == 0){
fsize = 1;
}
%>
<script>
window.opener.fnAttachfile('<%=Util.convertChinese(request.getParameter("ta"))%>','<%=fn%>','<%=sn%>','<%=fsize%>')
window.close()
</script>
<%
}
}


} catch (Exception e) {
//e.printStackTrace();
}
%>
<script language=javascript>
function f_check() {
if (document.all.SourceFile.value=="")
{
alert ("请选择文件!")
return false
}
else {
document.all.f1.submit()
}
}
</script>
</head>
<BODY BGCOLOR="white" topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" >

<form method=post ENCTYPE="multipart/form-data" onsubmit="return f_check();" name="f1" >
<table width="100%" border="1" cellspacing="0" cellpadding="2" align="center" bordercolordark="#ffffff" bordercolorlight="#000000">

<tr>
<td bgcolor="#B58A00" height="21">
<div align="center"><font color="#FFFFFF" size="2"><b>文件上传</b></font></div>
</td>
</tr>
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0" style="border:solid black 1px" bordercolorlight="#000000" bordercolordark="#FFFFFF" class="9p" align="center">
<tr>
<td align="center" height="30">
<input type="file" name="SourceFile">
<input type="hidden" name="sfname" >
</td>
</tr>
<tr>
<td align="center" height="30">
<input type="submit" value="开始上传" name="butston" />
  
<input type="button" value="关闭窗口" onClick="window.close()" name="buttocn">
</tr>
</table>
</td>
</tr>
</table>
<br>
<span align="center">注:大小请控制在 2000K 内。</span>
</form>

</BODY>
</HTML>
...全文
429 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sherry521 2008-11-21
  • 打赏
  • 举报
回复
将得到的参数转下码
String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8"); //引用楼上的,呵呵
如果不行需要修改SmartUpload
struggle1 2008-11-21
  • 打赏
  • 举报
回复
String msg = request.getParameter("message");
String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");
out.println(st);

楼上正解
也可以这样:
Charset=gb2312首字c母大写 就可以省掉 getBytes()方法!
kaxudodo 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 alienj 的回复:]
一般说来在每个页面的开始处,加入:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<%
request.setCharacterEncoding("UTF-8");
%>

  charset=UTF-8 的作用是指定JSP向客户端输出的编码方式为“UTF-8”

  pageEncoding="UTF-8" 为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效

  request.setCharacterEncoding("UTF-8"); …
[/Quote]
你说的这些方法我都试过了,都没有效果
<%@ page language="java"
pageEncoding="utf-8"%>
我只要改成
<%@ page language="java"
pageEncoding="gb2312"%>就可以出现中文了
真的很奇怪。(页面编码也是utf-8)
jia19861029 2008-11-21
  • 打赏
  • 举报
回复
楼上正解
alienj 2008-11-21
  • 打赏
  • 举报
回复
一般说来在每个页面的开始处,加入:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<%
request.setCharacterEncoding("UTF-8");
%>

  charset=UTF-8 的作用是指定JSP向客户端输出的编码方式为“UTF-8”

  pageEncoding="UTF-8" 为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效

  request.setCharacterEncoding("UTF-8"); 是对请求进行了中文编码

  有时,这样仍不能解决问题,还需要这样处理一下:

String msg = request.getParameter("message");
String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");
out.println(st);
kaxudodo 2008-11-21
  • 打赏
  • 举报
回复
补充一下:我上传中文名的文件时,读到的中文名就是乱码
System.out.println("fileNameSN:"+fileNameSN);
nmgfeifei19858 2008-11-21
  • 打赏
  • 举报
回复
/下载存储文件名乱码解决
public static String toUtf8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i=0;i<s.length();i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append(c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) k += 256;
sb.append("%" + Integer.toHexString(k).
toUpperCase());
}
}
}
return sb.toString();
}
放到smartupload类中可以解决乱码问题不知道是否楼主要的
sherry521 2008-11-21
  • 打赏
  • 举报
回复
顶楼上的
sunnylyy 2008-11-21
  • 打赏
  • 举报
回复
分析下smartupload的源码就知道原因了。

smartupload.java的upload方法有这句话:
String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1);

没有指定charsetName,创建字符串的时候,会使用系统默认的字符编码:
Converters.getDefaultEncodingName()


也就是GBK或者GB2312。所以楼主用GB2312的时候才不会出错。

如果想解决这个问题,可以增加一个upload(String charsetName)方法,然后改一句代码:
String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1,charsetName);


shikunwen 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kingfengks 的回复:]
可能你的页面本来的文件编码有问题
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
用ECLIPSE可以查看文件的本来编码
[/Quote]
编码格式与传递方式post get是有关系的 两者的差别都可以根据这个完全解决
shikunwen 2008-11-21
  • 打赏
  • 举报
回复

如果楼上所说的还不行 你可以考虑:
1,在文件web.xml中配置filter
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
我是用的 SSH框架 你根据自己的环境修改
2,tomcat 的server.xml中配置
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='GBK' />

Xurui.Feng 2008-11-21
  • 打赏
  • 举报
回复
可能你的页面本来的文件编码有问题
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
用ECLIPSE可以查看文件的本来编码
yanbin1016 2008-11-21
  • 打赏
  • 举报
回复
页面的编码格式不统一必然会出乱码。。。要么用过滤器过滤一下或是手动给传递过来的参数转码。 要么都用英文
goldensand001 2008-11-21
  • 打赏
  • 举报
回复
我也碰到过跟你一模一样的问题,关注下
topyyii 2008-11-21
  • 打赏
  • 举报
回复
帮顶
dongqdonglin 2008-11-21
  • 打赏
  • 举报
回复
http://hi.baidu.com/%C3%CE%B5%AD%C8%BB/blog/item/ba77e2822281f4b96d8119ed.html
看看这个你就明白细节了

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧