`
sb33060418
  • 浏览: 150529 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java访问url编码

    博客分类:
  • java
阅读更多
使用java程序或者服务器后端程序访问某个url时,可以使用java.net.URL类,也可以使用apache的HttpClient包。
为了验证功能,在本地程序中可简单使用URL类,代码如下:
	public static String accessUrl(String urlString) throws IOException {
		URL url = new URL(urlString);
		HttpURLConnection urlcon = (HttpURLConnection) url.openConnection();
		urlcon.connect();
		InputStream is = urlcon.getInputStream();
		BufferedReader buffer = new BufferedReader(new InputStreamReader(is));

		StringBuffer bs = new StringBuffer();
		String l = null;
		while ((l = buffer.readLine()) != null) {
			bs.append(l);
		}
		String result = bs.toString();
		return result;
	}

但是放到tomcat服务器上运行时,却发现读取中文结果出现乱码。比如在调用QQ的api接口获取用户信息时,发现在java程序读取的"北京"和"男",却变成了"鍖椾含"和"鐢?。
尝试用new String(apiResult.getBytes("GBK"),"UTF-8");进行编码转发,发现双字的"北京"可以转换正确,单字的"男"或三字等字符串的最后一个字却不能正确转换。
猜测是使用URL的InputStream和Reader读取字节时使用的字节和本地环境有关:单个程序使用的是java的UTF-8,和服务器返回编码一致,不出现问题;在本地tomcat上运行时可能依赖于操作系统,使用GBK进行解码,导致出现乱码;又因为对服务器UTF8编码字节做GBK解码时导致数据丢失,再怎么编解码转不回来。

解决方案如下:
1.指定Reader的字符集
使用InputStream构建Reader时指定字符集与服务器一致,为UTF-8即可
		BufferedReader buffer = new BufferedReader(new InputStreamReader(is,
				"UTF-8"));

2.使用HttpClient
	public static String accessUrl(String urlString)
			throws ClientProtocolException, IOException {
		HttpClient httpClient = new DefaultHttpClient();
		HttpGet httpGet = new HttpGet(urlString);
		HttpResponse response = httpClient.execute(httpGet);
		String message = EntityUtils.toString(response.getEntity());
		// System.out.println(message);
		return message;
	}

HttpClient会优先使用响应Entity的ContentType的字符集,如果读取不到则使用指定的默认字符集,如果未指定则使用HttpClient的默认字符集(ISO-8859-1),源码如下:
	public static String toString(HttpEntity entity, Charset defaultCharset)
        throws IOException, ParseException
    {
......
        Charset charset = null;
        try
        {
            ContentType contentType = ContentType.get(entity);
            if(contentType != null)
                charset = contentType.getCharset();
        }
        catch(UnsupportedCharsetException ex)
        {
            throw new UnsupportedEncodingException(ex.getMessage());
        }
        if(charset == null)
            charset = defaultCharset;
        if(charset == null)
            charset = HTTP.DEF_CONTENT_CHARSET;
        Reader reader = new InputStreamReader(instream, charset);
......

所以如果服务器返回的响应里面没有ContentType且返回信息有中文,使用HttpClient也需要指定字符集
String message = EntityUtils.toString(response.getEntity(),"UTF-8");

建议使用HttpClient可以用到连接池等特性,https时也不用重复加载证书库。
分享到:
评论

相关推荐

    Java 使用javaCV、ffmpeg拉流H265 RTSP转推H264 RTMP可获取流访问人数(源代码)

    5)、支持获取流的访问数,可设置自动关闭0访问数的推流以节约系统资源。 6)、linux系统支持推流前系统资源限制。 7)、完整的日志输出,便于查看项目运行状况。 5、ffmpeg需要下载linux版本程序,并将路径添加...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA工具包大全

    提供发送电子邮件、FTP访问、HTTP访问、URL处理等相关功能。 parser(解析包): 提供CSV文件解析、EXCEL文件解析、XML解析、JSON解析、HTML解析的相关功能。 phrase(词语包): 提供关键词过滤、汉语拼音...

    java开源包11

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包6

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包9

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包101

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包4

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    JAVA语言程序设计【高清版】.pdf

    18 第3章 标识符和基本数据类型 19 3.1 Java的基本语法单位 19 3.1.1 空白、注释及语句 19 3.1.2 关键字 21 3.1.3 标识符 21 3.2 Java编码体例 22 3.3 Java的基本数据类型 23 3.3.1 变量和常量 23 ...

    java开源包5

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    Java开发详解.zip

    031902_【第19章:Java网络编程】_URL与URLConnection笔记.pdf 031903_【第19章:Java网络编程】_URLEncoder与URLDecoder笔记.pdf 031904_【第19章:Java网络编程】_TCP程序设计笔记.pdf 031905_【第19章:Java网络...

    java开源包8

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包10

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java jdk实列宝典 光盘源代码

    telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chatserver.java;聊天室客户端,...

    java开源包3

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包1

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java8源码-java-vue-pdf:java通过vuessr动态生成pdf解决方案Itonlyneedsvue

    java中带id访问基于vue的ssr服务nuxt nuxt中使用之前的id回调java获取业务数据 通过vue ssr服务端生成进行渲染过的html java接收到html通过itext生成pdf 注:由于ssr只支持get请求,所以如果一次将所有数据都通过url...

    一个简单的java爬虫产品

     遇到这个问题也是一个巧合,本来我抓取的是客户的一个网站,后来同事说如果客户看访问日志,这个月的数据会和平常的数据不一样,所以我就抓取公司的网站,结果,问题出现了。原先公司的网站是用GB2312编码做的页面...

Global site tag (gtag.js) - Google Analytics