当前位置: 技术问答>java相关
resin系统,在URL中最后的文件名是汉字时,链接总是出错,哪位大侠遇到过这样的问题?
来源: 互联网 发布时间:2015-04-21
本文导语: 是这样的,我的系统中要让用户上传文件,然后再建立链接,供需要时下载,比如说: 中文文件.jpg 但总是报错,而英文文件就无此问题。对于网上诸如加 或者编码的方法我都试过了,不行。我还用过这种方法: Stri...
是这样的,我的系统中要让用户上传文件,然后再建立链接,供需要时下载,比如说:
中文文件.jpg
但总是报错,而英文文件就无此问题。对于网上诸如加 或者编码的方法我都试过了,不行。我还用过这种方法:
String aN = java.net.URLEncoder.encode("中文文件");
结果也不行!!
哪位高人有办法,帮俺一把啊?
出错信息:
404 Not Found
/mail_at/fff/%E6%97%A0%E6%A0%87%E9%A2%98.jpg was not found on this server.
中文文件.jpg
但总是报错,而英文文件就无此问题。对于网上诸如加 或者编码的方法我都试过了,不行。我还用过这种方法:
String aN = java.net.URLEncoder.encode("中文文件");
结果也不行!!
哪位高人有办法,帮俺一把啊?
出错信息:
404 Not Found
/mail_at/fff/%E6%97%A0%E6%A0%87%E9%A2%98.jpg was not found on this server.
|
这不一定是(应该不是)resin的问题。
不知道你的web server用的是什么? iis、apache还是resin自带的httpd?
即使你用Window 2000 Server中文版所带iis建立的网站,用中文文件名也可能无法下载。而且这跟客户端的IE也有很大的关系!!比如ie的“始终用utf-8发送url”的选项。opera 6也无法访问中文文件名。
其实最主要的原因是url规格最初制订时候就没有考虑到中文的复杂编码问题。因此这个问题跟浏览器和server处理中文url的方法都密切相关。
根据url的一般定义,只用到字母和数字。其他特殊字符都被解释成%XX的形式。XX是该字符的ASCII码(十六进制)比如空格就变成了%20。而中文就更超级复杂!!!
因为基本上我们都用gb2312的编码,它是一种基于ASCII扩展的混长编码。普通的英文字母还是跟US-ASCII编码一样,中文则用两个超过127的ASCII字符合成。因此通常我们可以认为它是ANSI兼容的。在Window下,中文和ANSI的本地代码页同是936。于是一种发送url的方式就是简单的把一个中文当作两个ASCII字符来处理。
但是还有另外一种方法,就是把gb2312编码的中文转成utf-8再发送!这种转码当然是把一个中文字就当作真的一个字符来处理!就是unicode的字符!unicode中所有字符的地位都是一样的,无论是一个英文字母还是中文字还是蝌蚪文!utf-8是把unicode编码变成若干个ASCII码表示,中文一般会变成3个字节。因此如果你用ultraedit打开用utf-8编码保存的中文文件,将看到乱码。然后如果是url,则这3个字节再根据前面讲的url编码规则再进行编码!
由此中文在第一种情况下将变成%XX%XX,而第二种情况就变成%XX%XX%XX!
显然这两者不会相同!
如果客户端也就是浏览器处理url的方式跟服务器处理的方式不一致,那么你当然就不能下载了!即使一致,也可能由于转码后解码过程的bug(外国人的程序处理复杂的中文编码能不出bug吗?我说得都头昏,不要说做了)导致包含某些特定中文字组合的文件无法访问。
所以,说了那么多废话,其实一句话:不要用中文字做文件名就好了。实在需要的地方用拼音替代吧!
不知道你的web server用的是什么? iis、apache还是resin自带的httpd?
即使你用Window 2000 Server中文版所带iis建立的网站,用中文文件名也可能无法下载。而且这跟客户端的IE也有很大的关系!!比如ie的“始终用utf-8发送url”的选项。opera 6也无法访问中文文件名。
其实最主要的原因是url规格最初制订时候就没有考虑到中文的复杂编码问题。因此这个问题跟浏览器和server处理中文url的方法都密切相关。
根据url的一般定义,只用到字母和数字。其他特殊字符都被解释成%XX的形式。XX是该字符的ASCII码(十六进制)比如空格就变成了%20。而中文就更超级复杂!!!
因为基本上我们都用gb2312的编码,它是一种基于ASCII扩展的混长编码。普通的英文字母还是跟US-ASCII编码一样,中文则用两个超过127的ASCII字符合成。因此通常我们可以认为它是ANSI兼容的。在Window下,中文和ANSI的本地代码页同是936。于是一种发送url的方式就是简单的把一个中文当作两个ASCII字符来处理。
但是还有另外一种方法,就是把gb2312编码的中文转成utf-8再发送!这种转码当然是把一个中文字就当作真的一个字符来处理!就是unicode的字符!unicode中所有字符的地位都是一样的,无论是一个英文字母还是中文字还是蝌蚪文!utf-8是把unicode编码变成若干个ASCII码表示,中文一般会变成3个字节。因此如果你用ultraedit打开用utf-8编码保存的中文文件,将看到乱码。然后如果是url,则这3个字节再根据前面讲的url编码规则再进行编码!
由此中文在第一种情况下将变成%XX%XX,而第二种情况就变成%XX%XX%XX!
显然这两者不会相同!
如果客户端也就是浏览器处理url的方式跟服务器处理的方式不一致,那么你当然就不能下载了!即使一致,也可能由于转码后解码过程的bug(外国人的程序处理复杂的中文编码能不出bug吗?我说得都头昏,不要说做了)导致包含某些特定中文字组合的文件无法访问。
所以,说了那么多废话,其实一句话:不要用中文字做文件名就好了。实在需要的地方用拼音替代吧!
|
这是msdn中关于javascript API 方法escape()的说明
在JSP中也写一个类似的方法对链接有关的字符串进行编码就ok了
举例:
////////////////////////////////////////////////////////////////////
escape 方法
请参阅
encodeURI 方法 | encodeURIComponent 方法 | String 对象 | unescape 方法
应用于: Global 对象
要求
版本 1
对 String 对象编码以便它们能在所有计算机上可读,
escape(charString)
必选项 charstring 参数是要编码的任意 String 对象或文字。
说明
escape 方法返回一个包含了 charstring 内容的字符串值( Unicode 格式)。所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。例如,空格返回的是 "%20" 。
字符值大于 255 的以 %uxxxx 格式存储。
注意 escape 方法不能够用来对统一资源标示码 (URI) 进行编码。对其编码应使用 encodeURI 和encodeURIComponent 方法。
要求
版本 1
请参阅
encodeURI 方法 | encodeURIComponent 方法 | String 对象 | unescape 方法
应用于: Global 对象
在JSP中也写一个类似的方法对链接有关的字符串进行编码就ok了
举例:
////////////////////////////////////////////////////////////////////
escape 方法
请参阅
encodeURI 方法 | encodeURIComponent 方法 | String 对象 | unescape 方法
应用于: Global 对象
要求
版本 1
对 String 对象编码以便它们能在所有计算机上可读,
escape(charString)
必选项 charstring 参数是要编码的任意 String 对象或文字。
说明
escape 方法返回一个包含了 charstring 内容的字符串值( Unicode 格式)。所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。例如,空格返回的是 "%20" 。
字符值大于 255 的以 %uxxxx 格式存储。
注意 escape 方法不能够用来对统一资源标示码 (URI) 进行编码。对其编码应使用 encodeURI 和encodeURIComponent 方法。
要求
版本 1
请参阅
encodeURI 方法 | encodeURIComponent 方法 | String 对象 | unescape 方法
应用于: Global 对象
|
我的建议是上载的文件全部都自己管理起来,不要用原名!
|
好象没办法了
除非你重新修改一下他的原码
你用手工在ie地址里输入可以出来吗
换e文的吧
除非你重新修改一下他的原码
你用手工在ie地址里输入可以出来吗
换e文的吧
|
看看这篇文章对你用用没有?
-----------------------------------------------------
为了方便移植,是发用标准的SQL语句,否则与JDBC初衷相背
汉字处理上,既要指定HTML编码,还要指定response的contenttype,另外在存库之前和读库之后应分别可调用一个处理函数,处理函数可以返回原串,或对它进行编码,总之有机会编码就是了。另外如果要修改,只修改一个方法就可以了。预留空函数是编程的一种方法,特别是对JAVA中处理汉字有乱码这种常见问题。
另外,在getparameter之后,也可和读库相似的处理
虽然编码方法没有定法,但为了简单起见,也不宜写成接口,而是直接写成一个类的 静态方法,以下是读到串后的处理示例
String boid = db.DbConnection.bytes2gb(request.getParameter("boid"))
String boardsname = db.DbConnection.bytes2gb(rs.getString("boardsname"))
...
/**
#@ add by zzl at 2002.03.02
#@ (DbConnection.java)
package db;
*/
public static String bytes2gb(String gb)
{
String s =null;
if(gb!=null)
{
try{
s = new String(gb.getBytes("ISO8859_1"),"GB2312");
}catch(Exception e){
System.out.println(e.toString());
e.printStackTrace();
}
}
return s;
}
-----------------------------------------------------
为了方便移植,是发用标准的SQL语句,否则与JDBC初衷相背
汉字处理上,既要指定HTML编码,还要指定response的contenttype,另外在存库之前和读库之后应分别可调用一个处理函数,处理函数可以返回原串,或对它进行编码,总之有机会编码就是了。另外如果要修改,只修改一个方法就可以了。预留空函数是编程的一种方法,特别是对JAVA中处理汉字有乱码这种常见问题。
另外,在getparameter之后,也可和读库相似的处理
虽然编码方法没有定法,但为了简单起见,也不宜写成接口,而是直接写成一个类的 静态方法,以下是读到串后的处理示例
String boid = db.DbConnection.bytes2gb(request.getParameter("boid"))
String boardsname = db.DbConnection.bytes2gb(rs.getString("boardsname"))
...
/**
#@ add by zzl at 2002.03.02
#@ (DbConnection.java)
package db;
*/
public static String bytes2gb(String gb)
{
String s =null;
if(gb!=null)
{
try{
s = new String(gb.getBytes("ISO8859_1"),"GB2312");
}catch(Exception e){
System.out.println(e.toString());
e.printStackTrace();
}
}
return s;
}
|
我有办法如下:
中文文件.jpg
这种方法也适用也用 response.sendircet()重定为URL的中文问题
中文文件.jpg
这种方法也适用也用 response.sendircet()重定为URL的中文问题
|
用form试试..