中文附件无法下载的问题分析

详情:当点击附件后,浏览器地址栏已经出现了正确路径(*/测试一下.doc,经测试迅雷亦可下载下来),但并没有出现预期的打开/下载对话框,而显示“无法显示网页”。但有一个doc文件文件却可以。经过比对,唯一的区别在于能下的文件的文件名是11个汉字,而其他的几个分别是8个或10个汉字,即偶数就会出错,真是长见识呀。
百度了一下,搜到如下文章。
在网上经常会看到有人问这样的问题:“我的文件名是中文的,放到Web服务器上让别人下载,却总是提示找不到文件,不过文件明明在那里呀?”。这种问题说到底就是编码的问题,什么UTF8、GBK、BIG5,一看就头疼。
对于这种问题,网上也有人提出了好多解决办法,比如对请求的文件名编码,或者把IE->工具--〉选项--〉高级 最下边的始终以UTF8编码发送的勾去掉,也就是不用UTF8编码发送URL,不过因为IE是默认的以UTF编码发送,所以就要每个人都改IE设置。
出现这种问题的大致原因就是:IE把URL中的中文以UTF8编码--->Web服务器接到URL之后,要进行解码,不同的WEB服务器解码规则也是不同的,不过一般都是以默认的字符集来解码,比如中文系统一般都是GBK吧,这样解出来的编码自然就是错的。
我的机器环境是:win2000中文+IIS5 ,下面我们来做个实验
一、在web根目录下新建一个文件,文件名为 "慈勤强.txt",内容为慈勤强。我们通过网页访问http://127.0.0.1/慈勤强.txt, 发现这个没问题,能够正常显示文件内容。
二、我们再建一个文件 "勤强.txt",内容为勤强。我们通过网页访问http://127.0.0.1/勤强.txt ,结果发现,无法找到网页。
三、我们再建一个文件 "鍕ゅ己.txt" ,内容为 “乱码”。我们通过网页访问http://127.0.0.1/鍕ゅ己.txt ,发现这个也没有问题,可以正常显示。
四、这时,我们再访问一下http://127.0.0.1/勤强.txt ,结果发现又可以访问了,但是很遗憾,出现的内容并不是我们希望的“勤强”,而是"乱码",也就是"鍕ゅ己.txt"文件的内容。
至此,大家应该可以明白一点了,就是"勤强"经过UTF8编码以后,IIS再用GBK解码,就解码成了"鍕ゅ己"。关于编码是挺繁琐的一件事情,在这里就不深入的分析了,大家只要知道UTF8编码,对于中文会编码成3个字节,而Unicode\GBK都是两个字节的. 比如 勤强 两个字经过UTF8编码以后变成了 %E5%8B%A4%E5%BC%BA ,一共6个字节了,%E5%8B%A4 是勤%E5%BC%BA 是强。
IIS解码则是按照两个字节一个汉字的方式来解码,也就是会把 %E5%8B 按照gbk解码成一个字, %A4%E5 一个%BC%BA 代表一个字。 我们可以去查GBK编码表,发现 E58B 是鍕, A4E5是ゅ,BCBA是己。
所以,对于IIS来说,如果非要用中文文件名的话, 中文的字数就应该是奇数的,就应该不会有问题(我这台机器得出的结论,可能不适合别的),比如 词.txt 茨此次.txt 都可以正常显示,偶数的就会出问题了,比如"我们都是小孩.txt"。对于其他的Web 服务器,比如apache之类的,可能就不是这个样子的了,具体也不清楚。

(0)

相关推荐

  • 中文附件无法下载的问题分析

    详情:当点击附件后,浏览器地址栏已经出现了正确路径(*/测试一下.doc,经测试迅雷亦可下载下来),但并没有出现预期的打开/下载对话框,而显示"无法显示网页".但有一个doc文件文件却可以.经过比对,唯一的区别在于能下的文件的文件名是11个汉字,而其他的几个分别是8个或10个汉字,即偶数就会出错,真是长见识呀. 百度了一下,搜到如下文章. 在网上经常会看到有人问这样的问题:"我的文件名是中文的,放到Web服务器上让别人下载,却总是提示找不到文件,不过文件明明在那里呀?&quo

  • SpringBoot mail中文附件乱码的解决方法

    前一段时间做过一个邮件发送的服务,以前大体都测试过,文本.图片.附件都是没有问题的,可有同事反应发送的附件名称有中文乱码,类似如下截图展示: 咋一看不像乱码,抱着试试看的态度,为MimeMessageHelper硬性加了编码: helper.addAttachment(MimeUtility.encodeText(fileName), file); 并且对文件名称加了转码: MimeUtility.encodeText(attachmentFilename) 但是,如果你跟进源码会发现sprin

  • PHP中实现中文字符进制转换原理分析

    一,中文字符转十进制原理分析 GBK编码中一个汉字由二个字符组成,获取汉字字符串的方法如下 复制代码 代码如下: $string = "不要迷恋哥"; $length = strlen($string); for($i=0;$i<$length;$i++){ if(ord($string[$i])>127){ $result[] = ord($string[$i]).' '.ord($string[++$i]); } } var_dump($result); 由于一个汉字为

  • 07神奇四侠2 清晰TS-R(带中文字幕) 迅雷下载地址

    ◎译 名 神奇四侠2 ◎片 名 Fantastic Four Rise Of The Silver Surfe ◎年 代 2007 ◎国 家 美国 ◎类 别 动作/科幻 ◎语 言 英语 ◎字 幕 中文字幕 ◎文件格式 XviD + MP3 ◎视频尺寸 640 x 208 ◎文件大小 1CD 50 x 15MB ◎片 长   ◎导 演 Tim Story ◎主 演 Ioan Gruffudd ... Reed Richards  Jessica Alba ... Sue Storm  Chris 

  • avira premium avira中文绿色版下载

    本版特点 Quote: *实现任意位置注册 *支持vista系统 *支持右键扫描 *无服务加载 完全绿色 *采用Avira Premium Security Suite V8-beta4新引擎,可以让大家体验一下新的S版本的进步 使用说明 Quote: *第一次使用先运行!GAV-Avira Premium Security Suite.exe 进行注册使用,vista用户请以 管理员身份运行! *测试版本过期了怎么办? 这版本测试将延续到4月4日,到时候期待我新版本的绿化吧,呵呵~! *如何升

  • Linux服务器配置PHP文件下载,中文乱码问题,下载出错如何解决

    俩个坑点 1. 操作系统的编码问题 windows上的默认编码是gbk,所以如果文件名采用的是中文,那么上传到Linux上面,由于默认编码是utf-8就会出现文件名乱码! 解决办法,手动重命名 2. PHP.ini 配置文件中默认编码是 ISO-8859-1 sudo vi /etc/php5/apache2/php.ini 打开文件后,按下"/default_charset"进行搜索, 按下回车键,找到default_charset的位置,进行修改. 把注释去掉,即是把":

  • node.js突破nginx防盗链机制,下载图片案例分析 原创

    问题 今天项目需求要求采集几个网站的信息,包括一些区块链统计图表之类的信息. 笔者使用的是node.js+axios库发送get请求来获取在图片,下载到本地.测试代码如下: import fs from 'fs'; import path from 'path'; import http from 'http'; import https from 'https'; const __dirname = path.resolve(); let filePath = path.join(__dirn

  • JSP页面中文参数的传递(get和post方法分析)

    在项目中,我们经常遇到需要在JSP页面切换中传递中文字符.这主要有两种方式. ◆URL方式 例如: http://website/test1.jsp?act=add&type=苹果&param=%20D%20B ◆FORM方式 例如: 复制代码 代码如下: ﹤form name=test   mehtod="post"﹥   ﹤input type=hidden name=text2 value="中文"﹥   ﹤input type=text na

  • java、javascript实现附件下载示例

    在web开发中,经常需要开发"下载"这一模块,以下给出一个简单的例子. 在服务器端,使用java开发: @RequestMapping(value = "download.html", method = RequestMethod.GET) public void download(String resourceid, HttpServletRequest request, HttpServletResponse response) { response.setCo

  • Sql server 2012 中文企业版安装图文教程(附下载链接)

    首先推荐一个网站http://msdn.itellyou.cn/,这是一个非常棒的网站,各种正版资源,安全无毒 先选择服务器如何选择SQL Server 2012 选择自己要的版本,这里笔者选的是中文企业版,下载地址附上,复制到迅雷下载即可注意这里的是64位版,如果32位机器去网站上找x86的版本,笔者还是建议换成64位的系统吧 ed2k://|file|cn_sql_server_2012_enterprise_edition_with_sp1_x64_dvd_1234495.iso|4231

随机推荐