`

URL中文问题

阅读更多

最近使用HttpClient,和Java的java.net.URL,url有中文都会失败。

听徐师兄说HttpClient有URI这个类可以使用:

URI uri = new URI(url,false,"UTF-8");
String url = uri.toString();

 例如,发送一个get请求获得一个带有中文链接的图片:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.methods.GetMethod;
/**
 * @author fuliang
 */
public class Test {
	public static void main(String[] args) throws HttpException, IOException {
		String url = "http://www.byecity.com/photoocean/photo/全球图片/亚洲/柬埔寨/s/7723132569.jpg";
		GetMethod get = null;
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		
		try {
			URI uri = new URI(url,false,"UTF-8");
			HttpClient hc = new HttpClient();
			get = new GetMethod(uri.toString());
			int status = hc.executeMethod(get);
			if (status == 200) {
				bis = new BufferedInputStream(get
						.getResponseBodyAsStream());
				bos = new BufferedOutputStream(
						new FileOutputStream("/home/fuliang/photo.jpg"));

				byte[] buffer = new byte[1024];
				int len = 0;
				while ((len = bis.read(buffer)) != -1) {
					bos.write(buffer, 0, len);
				}
			}
		} finally {
			if(get != null){
				get.releaseConnection();
			}
			if(bis != null){
				bis.close();
			}
			if(bos != null){
				bos.close();
			}
		}
	}
}

 如果使用java.net.URL而不想引入httpclient的包,我写了一个方法可以基本解决中文url的问题,对非ascii码进行encoding(健壮性肯定没有httpclient那个好,也可以直接把httpclient中的那个源码摘出来用):

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class URLUtil {
	public static String encodeURL(String url,String encode)
			throws UnsupportedEncodingException {
		StringBuilder sb = new StringBuilder();
		StringBuilder noAsciiPart = new StringBuilder();
		for (int i = 0; i < url.length(); i++) {
			char c = url.charAt(i);
			if (c > 255) {
				noAsciiPart.append(c);
			} else {
				if (noAsciiPart.length() != 0) {
					sb.append(URLEncoder.encode(noAsciiPart.toString(),encode));
					noAsciiPart.delete(0, noAsciiPart.length());
				}
				sb.append(c);
			}
		}
		return sb.toString();
	}
}

举一个同样使用java.net.URL下载的例子:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import org.apache.log4j.Logger;

public class Downloader {
	private static Logger logger = Logger.getLogger(Downloader.class);

	public static boolean download(String urlString, String savePath) {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			urlString = URLUtil.encodeURL(urlString,"UTF-8");
			bis = new BufferedInputStream(
					getDownloadInputStream(urlString));

			bos = new BufferedOutputStream(new FileOutputStream(savePath));

			byte[] buffer = new byte[2048];
			int len;
			while ((len = bis.read(buffer,0,buffer.length)) != -1) {
				bos.write(buffer, 0, len);
			}
		} catch (MalformedURLException e) {
			logger.error("Error url: " + urlString, e);
			return false;
		} catch (IOException e) {
			logger.error("Get connection " + urlString + "failed",
					e);
			return false;
		} finally {
			try {
				if (bis != null) {
					bis.close();
				}
				if (bos != null) {
					bos.close();
				}
			} catch (IOException e) {
				logger.error("close failed", e);
				return false;
			}
		}
		return true;
	}
	
	private static InputStream getDownloadInputStream(String urlString)
			throws IOException {
		URL url = new URL(urlString);
		URLConnection connection = url.openConnection();
		InputStream inputStream = connection.getInputStream();
		return inputStream;
	}

	public static OutputStream getSavaOutputStream(String path)
			throws FileNotFoundException {
		OutputStream fileOutputStream = new FileOutputStream(path);
		return fileOutputStream;
	}
	
	public static void main(String[] args) {
		download("http://www.byecity.com/photoocean/photo/全球图片/欧洲/希腊/s/76291161.jpg","/home/fuliang/test.jpg");
	}
}
 

 

 

6
0
分享到:
评论
4 楼 srhlwdamon 2015-03-03  
太感谢了!!!!
非常有用!  解决了中文的乱码问题!!
3 楼 di1984HIT 2014-11-20  
不错,通过URL ENcode一下呗
2 楼 中国娃 2012-07-11  
多谢了,
1 楼 wqjqqtbb 2011-04-20  
多谢

相关推荐

    java中文乱码之解决URL中文乱码问题的方法

    URL中文乱码问题主要是由于URL编码和解码过程中的不一致导致的。下面将详细介绍如何解决这个问题,并探讨几种常用的方法。 首先,我们需要了解URL编码的基本原理。URL(统一资源定位符)不能包含某些特殊字符,如...

    swift-url分类解决URL里面的空格中文及其他特殊字符问题

    以上就是通过Swift的URL分类来解决URL中的空格、中文和其他特殊字符问题的基本方法。通过自定义的`encoded()`方法,我们可以确保URL的合法性,从而避免网络请求出错。在实际开发中,可以根据项目需求进行适当的调整...

    JS实现URL编码转换中文

    通过了解URL编码的基础知识以及使用JavaScript内置函数的具体操作方法,可以帮助开发者更好地处理Web应用中的中文字符问题。此外,还讨论了处理更多特殊字符的情况,这对于国际化应用程序来说尤为重要。掌握这些技巧...

    解决apache对含中文的url网址的支持问题(64位)

    本文将深入探讨如何解决Apache对含中文URL网址的支持问题,特别是针对64位系统的情况。 首先,我们需要了解`mod_encoding`模块。这是一个Apache模块,主要用于处理HTTP请求的编码,以适应不同的字符集。在某些情况...

    JAVA解决URL路径中含有中文的问题

    JAVA解决URL路径中含有中文的问题。无论是路径中还是文件名包含中文都可以处理。经测试验证通过。

    Android Url中文乱码问题

    在开发过程中遇到了Url的中文乱码问题,经过多次测试,解决了问题,并分享给大家,希望能够你帮助!

    url中文字符解码

    通过URLEncoder.encode加密地址栏url上得中文字符, 并可通过java.net.URLDecoder.decode(str, charset)解密中文

    URL中包含中文文件名的问题

    标题“URL中包含中文文件名的问题”涉及到的是在互联网中如何处理含有中文字符的文件名。在Web开发中,URL(统一资源定位符)是访问网络资源的主要方式,但URL编码规则并不支持直接包含所有非ASCII字符,尤其是中文...

    汉字转为HTML的URL编码

    搜集了网上的VBA函数,在excel中通过函数将汉字转为两种类型的URL编码,例如将 天空 二字转化为GB2312的“%CC%EC%BF%D5”或者是UTF-8的 “%E5%A4%A9%E7%A9%BA”。方便用于连接转换。VBA相关函数均来自网上,做了小小...

    jsp使用URL编码传递中文参数问题.doc

    在JSP开发中,处理URL编码传递中文参数是常见的需求,尤其是在构建动态网页时。这个问题主要涉及到字符编码的转换,因为不同的编码标准可能导致乱码。以下是对这个主题的详细解释: 1. **URL编码**:URL(统一资源...

    asp.net中URL参数传值中文乱码的三种解决办法

    在ASP.NET开发过程中,我们时常会遇到URL参数传递中文字符时出现乱码的问题。这个问题主要源于字符编码不一致导致的,下面将详细讲解三种解决这个问题的方法。 ### 方法一:设置Web.config配置 在ASP.NET应用的`...

    jquery获取URL中参数解决中文乱码问题的两种方法

    当我们需要在两个页面间通过URL传递参数时,经常会遇到中文乱码问题。这个问题主要是因为URL中的参数可能没有经过正确的编码和解码处理。为了解决这个问题,我们可以采取一些方法,特别是当使用jQuery来获取URL参数...

    URL中汉字乱码问题

    标题“URL中汉字乱码问题”涉及到的是在Web开发中常见的字符编码问题,尤其是在处理包含汉字的URL时。URL(Uniform Resource Locator)是用于定位网络资源的地址,它必须遵循特定的编码规则,以确保在不同系统间传输...

    URL中文字符

    本文将深入探讨URL中文字符的转码过程以及如何处理URL中的不定参数。 首先,我们来理解URL编码的基本原理。URL编码遵循的是UTF-8标准,并使用百分号(%)进行编码。在URL中,除了字母、数字、减号(-)、下划线(_...

    url地址传参中文乱码处理

    "URL地址传参中文乱码处理" URL地址传参中文乱码处理是指在Web应用程序中,将中文参数传递给...在处理URL地址传参中文乱码时,需要根据具体情况选择合适的解决方案,并注意编码问题、特殊字符处理和Tomcat配置等方面。

    URL中如果含有中文等非ASCII字符

    ### URL中含有中文等非ASCII字符的相关知识点 #### 一、URL与非ASCII字符的基本概念 在互联网中,统一资源定位符(Uniform Resource Locator,简称URL)是用于标识互联网上资源位置的一种标准格式。URL通常包括...

    URL中文转换

    在开发Android应用,尤其是涉及到网页浏览功能时,URL中文转换是一个关键的技术环节。这是因为URL(统一资源定位符)在互联网中被广泛使用,用于指向网络上的特定资源,而中文字符在URL中通常需要进行编码才能正确...

    解决Python 爬虫URL中存在中文或特殊符号无法请求的问题

    这种问题,初学者应该都会遇到,分享给大家做个参考! from urllib.parse import quote ... 您可能感兴趣的文章:Python 爬虫之超链接 url中含有中文出错及解决办法解决python爬虫中有中文的url问题Py

Global site tag (gtag.js) - Google Analytics