星期三, 十二月 20, 2006
下载文件的中文文件名问题
为何需要自己写下载程序,基本上都是出于安全考虑,而不是基于性能考虑,这里就不详细描述了,只写下在其中遇到的中文文件名问题。
网上有很多这方面资料,基本上都沾边,又不完整。
目前发现主要问题就是IE识别的是utf8编码,而firefox之类的浏览器识别的是ISO8859-1编码。还有一个就是空格的处理,不同浏览器是不一样处理的。另外据说老版本IE有150个字符的问题,经测试在IE6或更高版本中,已经可以自动截断了,这里就不再写处理办法了,其实如果需要处理就是把文件名自己截短即可。
String agentName = request.getHeader("user-agent");
boolean agentBeIE = (agentName!=null && agentName.indexOf("MSIE")>=0);
if (agentBeIE) {
encoding = "UTF-8";
attachFilename = java.net.URLEncoder.encode(saveas_filename, encoding);
attachFilename = attachFilename.replaceAll("\\+", "%20");
}
else {
encoding = "ISO8859_1";
attachFilename = new String(saveas_filename.getBytes("UTF-8"),encoding);
}
response.reset();
response.setCharacterEncoding(encoding);//似乎不起作用
response.setHeader("Content-Type",file_contenttype + ";charset=" + encoding);
response.setHeader("Content-Disposition",(isOnLine?"inline; ":"attachment; ")+"filename=\"" +attachFilename +"\"");
response.setHeader("Cache-Control", "no-cache,must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setContentLength((int) filesize);
ServletOutputStream sout = response.getOutputStream();
byte[] buf = new byte[0x40000]; //256K=2^18=4*2^16
int nNumber=0;
long nTotalRead=0;
while ((nNumber = is.read(buf)) != -1)
{
sout.write(buf, 0, nNumber);
nTotalRead += nNumber;
}
sout.flush(); //输入完毕,清除缓冲
sout.close(); //关闭输出
response.flushBuffer();
星期五, 十一月 24, 2006
中文问题(UTF8:ajax,jsp,java,mysql)
以UTF8编码测试一切顺利。按照前面那篇文章的设置即可,将GBK部分改为UTF8即可。
唯一遇到比较麻烦的是,原来用GBK编码写的jsp代码中的中文,全部变为乱码,需要找一个合适的工具将全部的源码编码修改一遍。
需要补充一点:关于配置文件中default-character-set的设置,还有一个client设置。
[mysql]
default-character-set=gbk
[client]
default-character-set=gbk
[mysqld]
default-character-set=gbk
测试了中文、日文、法文、俄文、阿文等字符的测试,一切顺利。
中文问题(UTF8:ajax,jsp,java,mysql)
以UTF8编码测试一切顺利。按照前面那篇文章的设置即可,将GBK部分改为UTF8即可。
唯一遇到比较麻烦的是,原来用GBK编码写的jsp代码中的中文,全部变为乱码,需要找一个合适的工具将全部的源码编码修改一遍。
需要补充一点:关于配置文件中default-character-set的设置,还有一个client设置。
[mysql]
default-character-set=gbk
[client]
default-character-set=gbk
[mysqld]
default-character-set=gbk
测试了中文、日文、法文、俄文、阿文等字符的测试,一切顺利。
中文问题(GBK:ajax,jsp,java,mysql)
2周一开始折腾中文问题,也算是老同志遇上老问题了,今天总算搞定了GBK相关的设置,明天再看看纯UTF8存储和交互的设置,一并测试中英西法葡俄阿日等多语种共同存储的相关问题。
提交ajax中文数据,基本可以这么解决:(POST数据时,注意UTF8问题)
var oXmlHttp = zXmlHttp.createRequest();
oXmlHttp.open("post", oForm.action, true);
oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;; charset=UTF-8");
oXmlHttp.send(sBody);
后台回复前端ajax中文时,参照如下代码:
response.setHeader("Content-Type", "text/html;charset=GBK");
PrintWriter out = response.getWriter();
out.print("回复数据:这是中文,welcome");
下面再说mysql中文问题,使用的是mysql5.0, tomcat5.0:
(1)数据库缺省字符集
修改/etc/my.cnf文件.改成如下内容:
[mysqld]
default-character-set=gbk
(2)数据库中文
CREATE DATABASE dbname DEFAULT CHARACTER SET GBK;
SET NAMES GBK;
SET CHARACTER SET GBK;
(3)JDBC连接
DbDriver = com.mysql.jdbc.Driver
DbUrl = jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=gbk
(4)导入中文数据
mysql --default-character-set=gb2312 dbname < backupdbfile.mysql
测试了以"镕"为代表的GBK字符,mysql存储和jsp显示均没有问题。
提醒:在用户可以看到的jsp页面中,使用的是GBK编码。
星期三, 十一月 22, 2006
中文问题(GBK:ajax,jsp,java,mysql)
周一开始折腾中文问题,也算是老同志遇上老问题了,今天总算搞定了GBK相关的设置,明天再看看纯UTF8存储和交互的设置,一并测试中英西法葡俄阿日等多语种共同存储的相关问题。
提交ajax中文数据,基本可以这么解决:(POST数据时,注意UTF8问题)
var oXmlHttp = zXmlHttp.createRequest();
oXmlHttp.open("post", oForm.action, true);
oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;; charset=UTF-8");
oXmlHttp.send(sBody);
后台回复前端ajax中文时,参照如下代码:
response.setHeader("Content-Type", "text/html;charset=GBK");
PrintWriter out = response.getWriter();
out.print("回复数据:这是中文,welcome");
下面再说mysql中文问题,使用的是mysql5.0, tomcat5.0:
(1)数据库缺省字符集
修改/etc/my.cnf文件.改成如下内容:
[mysqld]
default-character-set=gbk
(2)数据库中文
CREATE DATABASE dbname DEFAULT CHARACTER SET GBK;
SET NAMES GBK;
SET CHARACTER SET GBK;
(3)JDBC连接
DbDriver = com.mysql.jdbc.Driver
DbUrl = jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=gbk
(4)导入中文数据
mysql --default-character-set=gb2312 dbname < backupdbfile.mysql
测试了以"镕"为代表的GBK字符,mysql存储和jsp显示均没有问题。
提醒:在用户可以看到的jsp页面中,使用的是GBK编码。