关于网页中图片名包含中文(或空格)无法显示的解决办法

网页中很多时候要用到图片,通过img标签或者滤镜来显示在页面上。而当文件名包含中文(或空格)时会遇到图片无法正确加载,服务器端的不识别中文的路径名。

解决办法如下:
1.改变服务器的配置,使服务器支持utf-8来显示图片。这个经过测试是有效的,但是有一点是服务器配置修改了以后,再使用request来获取参数时,中文乱码的问题。通过System.out.print来打印出来的参数是正确的,但是赋值给String对象后却不是正确的值,再通过String对象的getBytes方法来转换以后仍然不正确。所以放弃了这个方法。参照:http://blog.sina.com.cn/s/blog_6396f2610100l6dg.html

----------------------------------------------------------------------------------------------------------------------

在html页面中,引用了带汉字的图片,形如<img src="/目录/子目录/图片名字.jpg"/>,如果没有在tomcat配置URIEncoding,则无法显示。修改方法:

在tomcat的server.xml中加入URIEncoding="utf-8"(网页的编码是utf-8)
   <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" disableUploadTimeout="true"URIEncoding="utf-8" redirectPort="8443" />


----------------------------------------------------------------------------------------------------------------------


2.给中文名(和空格)用URLEncoder进行utf-8编码,出来一个带有%号的字符串,%也不是合法的文件名,所以还得replaceAll替换掉所有的%,然后为了区别这种编码后的文件名和一般的文件名的不同,在文件名前加一些前缀以示区别,要取这个文件名的时候根据前缀判断是否编码的文件名,如果是,再用URLDecoder解码回来。


判断文件名中是否包含中文或空格:

	private static boolean haveSpecial(String str){
		if(str.contains(" ")){
			//have space
			return true;
		}else{
			char min = '\u4E00';
			char max = '\u9FBF';
			for(char c : str.toCharArray()){
				if(c > min && c < max){//have Chinese character
					return true;
				}
			}
		}
		return false;
	}

编码及解码的方法:

private static final String ENCODE = "_encode_";
private static String encode(String fileName) throws UnsupportedEncodingException{
	return (ENCODE + URLEncoder.encode(fileName,"UTF-8")).replace("%", "_").replace("+", "-");
}
	
private static String decode(String alias) throws UnsupportedEncodingException{
	String deco = alias.substring(ENCODE.length()).replace("_", "%").replace("-", "+");
	return URLDecoder.decode(deco,"UTF-8");
}

用法示例:

				String alias = cur_image;
				if(haveSpecial(cur_image)){
					alias = encode(cur_image); 
				}

File dir = new File(dirPath);
if (!dir.exists())
	dir.mkdirs();
if (dir.listFiles().length != 0) {
	for (File f : dir.listFiles()) {
		String fname = f.getName();
		if(fname.startsWith(ENCODE)){//encoded file name
			try {
				fname = decode(fname);
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		images.append(fname).append(",");
	}
	if (!images.equals(""))
		images.deleteCharAt(images.length() - 1);
} else {// default
	images.append(DEFAULT_IMAGE);
}

这样保存文件名也可能出现问题,一是如果非编码的文件名也是以ENCODE字符串开头的(例上文中以_encode_开头),则这些文件会被误解码,这个问题出现的概率很小。二是如果待编码的文件名中既包含空格又包含加号+,则编码时会全部转换成减号-,然后解码时会把所有的减号-解码成了空格,跟编码前的文件名稍有不同,这个问题的影响不大。总的来说,第二种方法还是比较好,避免了中文的问题。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值