`
sb33060418
  • 浏览: 152492 次
  • 性别: 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时也不用重复加载证书库。
分享到:
评论

相关推荐

    解析URL和文件的编码方式

    此外,Java的`java.net.URLDecoder`和`java.net.URLEncoder`类也提供了URL编码和解码的功能。 文件的编码方式有时会在文件的头部或通过其他方式指定,如XML文件的`<?xml version="1.0" encoding="UTF-8"?>`声明。在...

    java 版Url转换工具,可得到真实的URL

    工具可能包含对URL编码和解码的支持,例如将空格转换为`%20`,或者将 `%xx` 转回对应的字符。 4. **参数处理**:URL查询参数是URL中以问号`?`分隔的部分,工具可以解析这些参数,提取键值对,并支持添加、删除或...

    java URL转PDF文件

    在Java中,我们可以使用`java.net.URL`和`java.net.HttpURLConnection`类来实现。以下是一个简单的示例: ```java URL url = new URL("http://example.com"); HttpURLConnection connection = (HttpURLConnection) ...

    每个web开发者都应该知道的url编码知识

    2. **解码后的URL无法解析**:如果URL编码不当,可能会导致解码后的URL无法被正确解析,进而影响到资源的定位和访问。 3. **解码后无法重新编码成相同形式**:有些编码方式可能导致解码后再编码与原始URL不一致,这...

    UrlEncodeUrlDecodeUrl解码Url编码工具

    UrlEncodeUrlDecodeUrl解码Url编码工具正是为了解决这一问题而设计的。它是一个实用的小工具,能够帮助用户对URL进行编码和解码,确保数据在通过网络传递时保持完整性和可读性。 URL(统一资源定位符)是互联网上的...

    java根据url获取html源文件

    不过,基础的URL访问和输入流读取是所有网络编程的基础,理解这些概念对于后续的学习至关重要。 总结一下,Java获取HTML源文件的关键步骤包括: 1. 创建`URL`对象表示目标网页。 2. 打开与URL的连接,获取`...

    java short URL

    1. **长网址编码**:首先,需要将长网址进行编码,如使用Base64或URL编码,确保数据安全无误地存储。 2. **哈希计算**:然后,使用哈希函数(如MD5)对编码后的长网址生成哈希值。尽管MD5不可逆,但可以用作索引。 ...

    url获取的java源代码

    在Java编程语言中,获取URL是一项基础且重要的任务,它涉及到网络编程和数据抓取领域。本示例的"GetURL.java"文件提供了一个简单的Java程序,用于抓取网页上的URL地址,为构建网络爬虫提供了基本框架。下面将详细...

    通过URL地址获取网页生成jpg图片

    最后,Java端通过HTTP请求获取Base64编码的图片数据,解码并保存为jpg文件: ```java String base64Image = fetchBase64ImageFromNodeServer(url); // 调用Node.js服务获取Base64数据 byte[] imageBytes = Base64....

    URL RFC 1738

    文档旨在规范URL的语法、语义以及资源访问的方式,以促进互联网上资源的定位和交互。 **1.URL的概述** URL是用于标识互联网上资源的字符串,它提供了资源的位置信息,允许用户或应用程序通过特定的协议访问这些...

    LoadRunner中转换字符串到URL编码

    在LoadRunner的脚本编写过程中,我们经常需要处理字符串,尤其是将普通字符串转换为URL编码格式,以确保数据正确无误地发送到服务器。本文将详细介绍如何在LoadRunner中进行URL编码,以及提供的C代码和转换工具。 ...

    java实现读取证书访问https接口

    在Java编程中,访问HTTPS(安全超文本传输协议)接口通常涉及到处理数字证书,这是为了确保数据传输的安全性。HTTPS通过使用SSL/TLS协议来加密通信,而证书是该协议的一部分,用于验证服务器的身份。本篇文章将深入...

    java通过url下载文件并输出的方法

    Java 通过 URL 下载文件并输出的方法 Java 通过 URL 下载文件并输出的方法是指在 Java 语言中使用 URL 连接来下载文件并将其输出到客户端的方法。本文将深入探讨这种方法的实现细节,并为开发者提供一个详细的参考...

    根据url来获取页面的截图

    Java的`java.net.URLEncoder`类可以帮助我们编码参数值,确保它们符合URL规范。 在提供的压缩包中,`截图网页图片`可能是实现这一功能的代码文件或者示例截图。如果需要具体实现,还需要查看代码文件内容或进行...

    java发送url请求获取返回值的二种方法

    使用目标URL创建一个`HttpPost`实例,并设置请求实体为`UrlEncodedFormEntity`,确保参数被正确编码。 6. **执行请求**: 使用`HttpClient`的`execute()`方法执行POST请求,并获取`HttpResponse`。 7. **处理...

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

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

    访问URL生成Mht文件

    标题中的“访问URL生成Mht文件”指的是将一个网页(通过其URL)转换为MHT(MHTML,即单个文件网页)格式的过程。MHT文件是一种存储网页内容的单一文件,包括HTML代码、图像和其他资源,使得网页可以在离线状态下查看...

    java通过url读取文件内容示例

    // 创建URL对象,指定要访问的文件或网页地址 URL url = new URL("http://example.com/path/to/file.txt"); // 打开与URL的连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); ...

    【Java】中常见的URL问题及解决方案Java基础教程.pdf

    在Java编程中,URL(统一资源定位符)是访问网络资源的重要工具,但同时也常常伴随着一些常见的问题。本文主要讨论了两个关键问题及其解决方案。 首先,Java中的`URLEncoder`类是一个常见的误区。尽管其名称暗示它...

Global site tag (gtag.js) - Google Analytics