今天给网址的时候乱码了。 首先,url可以是searchText=中文,后台new string (search text.getbytes (iso-8859-1 )、' gbk ' ),在jsp中是gbk的代码,
max threads=' 250 ' maxhttpheadersize=' 8192 '
emptysessionpath=' true ' protocol=' http/1.1 '
enable lookups=' false ' redirect port=' 8443 ' accept count=' 100 '
连接时间输出=' 20000 ' disableuploadtimeout=' true ' uri encoding=' utf-8 ' /
以前没有uriencoding这个属性,我帮你杀了它,问题就解决了。 此时使用的是默认值ISO-8859-1。
有关server.xml的配置,请参阅此url的文档
在解决问题的过程中,我特意研究了两个类: urlencode和urldecode。 之所以没有使用这个方案,是因为在获取页面上的连接时使用了开源的名为Cloud的类。
如果使用开机自检方法提交网页表单,则数据内容类型为application/x-www-form-urlencoded,该类型为1 .字符' a'-'z ',' a'-'z 3 .将非文本内容转换为“%xy”的形式。 xy是2位16进制数值; 4 .在每个name=value对之间放置符号。
编码过程非常简单,除非是ASCII码中的数字、字符或前面提到的标点符号,否则所有字符都将转换为字节格式,每个字节都用这种格式编写。 “%”后面跟两位十六进制数字。 空间是特别的情况。 因为太普通了。 它不仅可以编码为“”,还可以编码为“”。 加号()本身编码为。 当/#=和? 作为名称的一部分使用时,必须进行编码,而不是作为URL部分之间的分隔符使用。
类URL不会自动执行编码或解码。 您可以生成可以包含非法ASCII字符、非ASCII字符和%xx的URL对象。 方法使用getPath (和toExternalForm )作为输出方法时,不会自动编码或解码此字符和传输。 负责用于生成URL对象的字符串对象,以便正确编码所有字符。
名为urlencode的类负责将String编码为平台上的通用格式,urldecode类可以将URL转换为String格式。
以下是urlencode的演示。
publicstaticvoidmain (字符串[ ] args ) {
try {
system.out.println (urlencoder.encode (' thisstringhasspaces ',' 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 (' thisstringhaspluses ',' 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 (' th
is&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转换成正常的编码。