java常规编码问题
package com.boco;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class UnicodeCase {
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] str1="中".getBytes("utf8");
byte[] str2="中".getBytes("gbk");
byte[] str3="中".getBytes("iso8859-1");
for(int i=0;i<str1.length;i++){
System.out.print(str1[i]);
}
System.out.println();
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
String a=new String(str1,"utf8");
String b=new String(str2,"gbk");
String c=new String(str3,"iso8859-1");
String d=new String(str1,"iso8859-1");
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(new String(d.getBytes("iso8859-1"),"utf8"));
}
}
运行结果:
-28-72-83
[B@f62373
[B@19189e1
[B@1f33675
中
中
?
中
出现此种问题主要是 java对中文字符的编码问题
汉字 utf-8 三个字节表示 gbk 2个字节表示
没有iso8859-1编码 但是可以表示 (属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。 很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,以gb2312编码为例,应该是"d6d0 cec4"两个字符(Java字符占2个字节),使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的))
getBytes() 是Java编程语言中将一个字符串转化为一个字节数组byte[]的方法。String的getBytes()方法是得到一个系统默认的编码格式的字节数组。将一个String类型的字符串中包含的字符转换成byte类型并且存入一个byte[]数组中。在java中的所有数据底层都是字节,字节数据可以存入到byte数组。(详情可以查看api 免费下载地址http://download.csdn.net/detail/docuxu/9908841)
从上面的实例程序中 我们可以看出 utf8 和gbk的编码格式 在字符串和字节数组的形式下 可以相互转化。而 iso8859-1此种编码格式则在字符串转化为字节数组后 无法恢复。如果真的需要使用iso8859-1编码格式 我们可以使用utf或gbk的编码格式将其先转化为字节数组 然后再使用iso8859-1 最后还是通过对应编码恢复 知识中间对字节数组使用了iso8859-1。
URL参数编码问题
一、为什么要用URLEncoder
客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文。而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址,网址中的非ASCII码内容转换成可以传输的字符。不会被编码的内容:
1.大写字母A-Z
2.小写字母a-z
3.数字 0-9
4.标点符 - _ . ! ~ * ' (和 ,)
二、编码原理
1、将需要转换的内容(ASCII码形式之外的内容),用十六进制表示法转换出来,并在之前加上%开头
eg: 0x9c URLEncoder --> %9c
2、内容中的空格‘ ’ ,全部用+代替
3、注:与Hex不同,Hex是将所有的字符转换为16进制表示,而URLEncoder是将ASCII码集之外的转换为%加上相应的16进制,而ASCII码集内的字符不进行处理
1、所有的GET请求
2、网址中有中文等情况
3、POST请求,所有的Key和Value在提交之前都要经过URLEncoder
四、示例
try {
String a = URLEncoder.encode("a", "UTF-8");
Log.i("encode","a 进行URLEncoder编码后-->"+a );
String b = URLEncoder.encode("a中", "UTF-8");
Log.i("encode","a中 进行URLEncoder编码后-->"+b );
String decode = nURLDecoder.decode("a%E4%B8%AD", "UTF-8");
Log.i("encode","a%E4%B8%AD 进行URLDecoder解码后-->"+decode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
运行结果:
a 进行URLEncoder编码后-->a
a中 进行URLEncoder编码后-->a%E4%B8%AD
a%E4%B8%AD 进行URLDecoder解码后-->a中
可以看出 字符'a' 并没有编码 而 中文 '中' 进行了编码
与URLEncoder编码对应的是URLDecoder解码
可以看出 "a中"--编码-->"a%E4%B8%AD"--解码-->"a中"