当前位置:  技术问答>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. 

|
这不一定是(应该不是)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吗?我说得都头昏,不要说做了)导致包含某些特定中文字组合的文件无法访问。

所以,说了那么多废话,其实一句话:不要用中文字做文件名就好了。实在需要的地方用拼音替代吧!

|
这是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 对象


|
我的建议是上载的文件全部都自己管理起来,不要用原名!

|
好象没办法了
除非你重新修改一下他的原码

你用手工在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; 


|
我有办法如下:

中文文件.jpg  

这种方法也适用也用 response.sendircet()重定为URL的中文问题
  
  


|
用form试试..


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • resin及jetty介绍以及如何 查看他们的版本号
  • 请问单独用resin和用apache+resin有什么不同?
  • 2000下用apache+resin好还是IIS+resin?
  • resin与IIS整合后不及只开resin快??
  • 请问resin-2.1.4 与 resin ee 2.1.4有什么区别啊?
  • 卖分求真知﹕据说IIS装上RESIN插件后能支持JSP和SERVLET﹐请问什幺地方能下载RESIN?
  • Resin运行,出现如下提示,是否表示Resin已经运行正常了
  • 如何安装resin2.1.11 WEBSERVER和JDK1.4.2,resin和apache是什么关系?是一样的吗?
  • 服务器一开就可以了,没有什么简单复杂的吧?为什么很多人用resin+iis,而不直接用resin或tomcat,他们为什么说iis好用呢?
  • RESIN1.2.7里怎么改配置文件,可以让我的RESIN不用老是重起??
  • resin怎么配置成开机启动?
  • 关于RESIN死机的情况
  • apache+resin问题
  • resin和tomcat该选哪个?
  • 怎样把Resin加到win2000的服务里面??
  • 请问resin能在windows下安装成以服务的方式启动的形式吗
  • Resin 在IIS中的安装问题!
  • resin服务器的配置
  • Tomca 还是 Resin 好?
  • 由于把resin设置为开机启动服务,导致不能进入Xwindow!!
  • 如何配置一个resin WEB SERVER?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3