java urlencoder的使用_urlencoder和urldecoder的使用

java urlencoder的使用_urlencoder和urldecoder的使用今天传 url 的时候乱码了 先说情形 url 中有 searchText 中文的情形 后台 newString searchText getBytes ISO 8859 1 gbk 来获取 jsp 中的是 GBK 的编码 服务器用的是 jboss 里面有个 server xml 有如下配置 maxThreads 250 maxHttpHeade 8192 emptySession t

今天传url的时候乱码了。先说情形,url中有searchText=中文的情形,后台new String(searchText.getBytes(ISO-8859-1),”gbk”)来获取,jsp中的是GBK的编码,服务器用的是jboss,里面有个server.xml有如下配置。

maxThreads=”250″ maxHttpHeaderSize=”8192″

emptySessionPath=”true” protocol=”HTTP/1.1″

enableLookups=”false” redirectPort=”8443″ acceptCount=”100″

connectionTimeout=”20000″ disableUploadTimeout=”true” URIENCODING=”UTF-8″/>

之前是没有uriencoding这个属性的,我给干掉,问题解决,这时候用的是默认值即ISO-8859-1。

关于server.xml的配置可以参考这个url的文档

问题解决的过程中,我特意研究了一下urlencode和urldecode这两个类,之所以没有用这种方案是因为我获得页面上的连接的时候用的是一个开源的叫做Cloud的类。

网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会: 1.字符”a”-“z”,”A”-“Z”,”0”-“9″,”.”,”-“,”*”,和”_” 都不会被编码; 2.将空格转换为加号 (+) ; 3.将非文本内容转换成”%xy”的形式,xy是两位16进制的数值; 4.在每个 name=value 对之间放置 & 符号。

编码过程非常简单,任何字符只要不是ASCII码数字,字母,或者前面提到的标点符,它们都将被转换成字节形式,每个字节都写成这种形式:一个“%”后面跟着两位16进制的数值。空格是一个特殊情况,因为它们太平常了。它除了被编码成“%20”以外,还能编码为一个“+”。加号(+)本身被编码为%2B。当/ # = & 和?作为名字的一部分来使用时,而不是作为URL部分之间的分隔符来使用时,它们都应该被编码。

类URL并不自动执行编码或解码工作。你能生成一个URL对象,它可以包括非法的ASCII和非ASCII字符和/或%xx。当用方法getPath() 和toExternalForm( ) 作为输出方法时,这种字符和转移符不会自动编码或解码。你应对被用来生成一个URL对象的字符串对象负责,确保所有字符都会被恰当地编码。

URLencode这个类负责把String编码成平台上的通用形式,urldecode类可以把url转换成string格式。

下面是urlencode的demo:

public static void main(String[] args) {

try {

System.out.println(URLEncoder.encode(“This string has spaces”,”UTF-8″));

System.out.println(URLEncoder.encode(“This*string*has*asterisks”,”UTF-8″));

System.out.println(URLEncoder.encode(“This%string%has%percent%signs”, “UTF-8”));

System.out.println(URLEncoder.encode(“This+string+has+pluses”,”UTF-8″));

System.out.println(URLEncoder.encode(“This/string/has/slashes”,”UTF-8″));

System.out.println(URLEncoder.encode(“This\”string\”has\”quote\”marks”, “UTF-8”));

System.out.println(URLEncoder.encode(“This:string:has:colons”,”UTF-8″));

System.out.println(URLEncoder.encode(“This~string~has~tildes”,”UTF-8″));

System.out.println(URLEncoder.encode(“This(string)has(parentheses)”, “UTF-8”));

System.out.println(URLEncoder.encode(“This.string.has.periods”,”UTF-8″));

System.out.println(URLEncoder.encode(“This=string=has=equals=signs”, “UTF-8”));

System.out.println(URLEncoder.encode(“This&string&has&ersands”,”UTF-8″));

System.out.println(URLEncoder.encode(“Thiséstringéhasé non-ASCII characters”,”UTF-8″));

System.out.println(URLEncoder.encode(“this中华人民共和国”,”UTF-8″));

} catch (UnsupportedEncodingException ex) {throw new RuntimeException(“Broken VM does not support UTF-8”);

}

}

执行结果如下:

This+string+has+spaces

This*string*has*asterisks

This%25string%25has%25percent%25signs

This%2Bstring%2Bhas%2Bpluses

This%2Fstring%2Fhas%2Fslashes

This%22string%22has%22quote%22marks

This%3Astring%3Ahas%3Acolons

This%7Estring%7Ehas%7Etildes

This%28string%29has%28parentheses%29

This.string.has.periods

This%3Dstring%3Dhas%3Dequals%3Dsigns

This%26string%26has%26ersands

This%C3%A9string%C3%A9has%C3%A9+non-ASCII+characters

this%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD

很明显url中有/%&=这类字符也会被编码,对于我们来说是不对的。例如

public static void main(String[] args) {

try {

System.out.println(URLEncoder.encode(“pg=q&kl=XX&stype=stext&q=+\”Java+I/O\”&search.x=38&search.y=3″,”UTF-8”));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

这个结果就是不对的了,会有如下输出:

pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

所以这种情形我们要对每一部分做分段encode

pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

对于urldecoder类来说

它们解码以x-www-form-url-encoded这种形式编码的string。也就是说,它们把所有的加号(+)转换成空格符,把所有的%xx分别转换成与之相对应的字符

直接上demo:

public static void main(String[] args) {

String input = “http://www.altavista.com/cgi-bin/” + “query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3”;

String output;

try {

output = URLDecoder.decode(input, “UTF-8”);

System.out.println(output);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

输入的结果如下:

http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=+”Java I/O”&search.x=38&search.y=3

更多的可以参考这个文章:

总结一下,今天发生的中文乱码的问题最终的解决方案可能和urlencode和urldecode没有多大关系,这里有时间还要熟悉一下jboss的server.xml的配置文件。urlencode主要有encode方法,用来把url中非数字和字母的字符转换成%加两位16进制。urldecode主要有decode方法,用来把一个含有%加两位16进制的url转换成正常的编码。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231169.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java的invoke方法[通俗易懂]

    Java的invoke方法[通俗易懂]如果读一些Java或者相关框架的源码,实际上一定会经常出现invoke方法的调用,在自己或者团队封装框架时,如果有时候弄得不好经常也会报invoke相关的错。invoke方法是干什么的?有什么具体用途?首先要了解invoke方法干什么的以及具体用途,实际你要搞清他在源码那个class文件上,他在那个包里,追根溯源。invoke方法来自Method类,可能不会像我们经常用到的基础类型包装类,以及集合类还有他们的扩展和工具类使用的那么多。但是Method类所在的包可是大名鼎鼎的反射Reflact,不是有

    2022年6月7日
    33
  • 键盘enter事件时间页面绑定

    键盘enter事件时间页面绑定

    2022年1月9日
    52
  • jsoncpp 不能处理long类型数据

    jsoncpp 不能处理long类型数据

    2021年12月8日
    52
  • java递归生成树形菜单_java递归无限层级树

    java递归生成树形菜单_java递归无限层级树java递归实现权限树(菜单树)省市县多级结构

    2025年11月27日
    3
  • 不用go-(xxoo)agent的也有可能是程序员

    不用go-(xxoo)agent的也有可能是程序员记得是去年某个时候,在一个群里问大家是怎么翻(什么)墙的,发现很多人是用go-(xxoo)agent的,而我当时完全没听说过go-agent,因为我已经N多年不翻(什么)墙了,于是,有人就说:“连go-(xxoo)agent都没用过你还是程序员吗?”说实话,我也不希望我是程序员啊!可我真的没用过go-(xxoo)agent啊!想起我一位前同事,工作很多年了,却从来没用过linux!(也不知道他

    2022年7月17日
    22
  • RabbitMQ入门:Hello RabbitMQ 代码实例[通俗易懂]

    在之前的一篇博客RabbitMQ入门:认识并安装RabbitMQ(以Windows系统为例)中,我们安装了RabbitMQ并且对其也有的初步的认识,今天就来写个入门小例子来加深概念理解并了解代码怎么实

    2022年2月16日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号