java.net.URL进行网络连接的时候,如果url中包含中文,空格、花括号的时候,这时候java无法解析。具体请看
HttpGet\HttpPost 参数uri注意点
上面是在一个Thead的run方法里面异步获取图片。
上面的函数是编码函数,这个可以编码空格和中文,但是后来发现不支持url中的中文括号。
上面的代码先对url进行编码再连接远程服务器端获取图片。
这个时候怎么办呢??现在android项目里面有图片的异步加载,代码如下:
@Override
public void run() {
try {
InputStream is = new URL(url).openStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
boolean writesuccess = writeBitmapToFile(bitmap, url);
if (writesuccess) {
Message msg = new Message();
msg.what = GET_IMAGE_SUCESS;
msg.obj = bitmap;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
上面是在一个Thead的run方法里面异步获取图片。
但是实现过程中发现很多服务端能显示的图片到android客户端无法显示,后来发现时url中包含了空格,中文等之类的东西,导致无法解析。
那为什么浏览器上面可以解析呢?原来浏览器将url重新编码了,它将空格、中文等之类的特殊字符重新编码为其他字符。
那我们的java程序里面怎么实现呢??
代码:
private static String zhPattern = "[\\u4e00-\\u9fa5]+";
public static String encode(String str, String charset)
throws UnsupportedEncodingException {
str = str.replaceAll(" ", "+");// 对空字符串进行处理
Pattern p = Pattern.compile(zhPattern);
Matcher m = p.matcher(str);
StringBuffer b = new StringBuffer();
while (m.find()) {
m.appendReplacement(b, URLEncoder.encode(m.group(0), charset));
}
m.appendTail(b);
return b.toString();
}
上面的函数是编码函数,这个可以编码空格和中文,但是后来发现不支持url中的中文括号。
现在我给出android中新的异步获取图片的代码:
@Override
public void run() {
try {
String tempurl = encode(url, "utf-8");
InputStream is = new URL(tempurl).openStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
boolean writesuccess = writeBitmapToFile(bitmap, url);
if (writesuccess) {
Message msg = new Message();
msg.what = GET_IMAGE_SUCESS;
msg.obj = bitmap;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
上面的代码先对url进行编码再连接远程服务器端获取图片。
如果哪位大牛知道支持中文括号的方法,希望一定要告诉我一下,先谢谢啊