网页中很多时候要用到图片,通过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)
----------------------------------------------------------------------------------------------------------------------
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_开头),则这些文件会被误解码,这个问题出现的概率很小。二是如果待编码的文件名中既包含空格又包含加号+,则编码时会全部转换成减号-,然后解码时会把所有的减号-解码成了空格,跟编码前的文件名稍有不同,这个问题的影响不大。总的来说,第二种方法还是比较好,避免了中文的问题。