一、
什么是编码
编码就是把字符串类型转为byte类型数组。
记住:你看到的数据在传输的时候都是字符串格式的。
字符串转UTF-8
把“中”字使用utf-8的方式进行编码:
byte[] bytes = “中”.getBytes(“UTF-8”);
一个中文使用utf-8编码后的字节数目是三个。
字符串转GBK
把“中”字使用gbk的方式进行编码:
byte[] bytes = “中”.getBytes(“GBK”);
一个中文使用gbk编码后的字节数目是两个。
什么是解码
编码之后的字节,怎么让这些字节转为我们看懂的汉字,就是解码。
与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个“中”字.这个new String(byte[], decode)实际是使用decode指定的编码来将byte[]解析成字符串。
切记: 你是使用哪种编码方式编码的,就必须使用哪种方式进行解码。
UTF-8编码后的字节转字符串
String str = new String(bytes,“UTF-8”);
GBK编码后的字节转字符串
String str = new String(bytes,“GBK”);
案例
详细讲解请看:String字符串编码解码格式
import java.io.UnsupportedEncodingException;
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
String str1 = "中";
byte[] bytes = str1.getBytes("UTF-8"); //{-28,-72,-83}
byte[] bytes2 = str1.getBytes("GBK"); //{-42,-48}
byte[] bytes4 = "涓".getBytes("GBK"); //{-28,-72}
//如果我有gbk编码的中字,我只要有bytes2,转成UTF-8的中字
System.out.println(new String(bytes,"GBK")); //乱码:涓�
System.out.println(new String(bytes,"UTF-8")); //中
//涓字出来
byte[] byte3 = new byte[2];//长度为二
byte3[0] = bytes[0];
byte3[1] = bytes[1];
System.out.println(new String(byte3,"GBK")); //涓
}
}
为什么会出现涓
通过观察,看到了UTF-8编码后的前两个字节,对应GBK编码后的字节。
为什么涓后面有�
因为UTF-8编码后有三个字节,GBK来解码,但是GBK只有两个字节;因此多出一个字节。
二、web的req和resp编码
request编码
request是接受客户端请求,在后台进行编码。编码一致,则不乱码。
根据请求方式的不同,后台解决编码的方案也不同。
即使请求方式相同,前台meta对应的编码格式不同,后台处理编码的方案也不同。
具体的讲解请看:3.HTTP_Request
response编码
response是返回给客户端响应,可以对响应的内容进行编码,也可以设置客户端以什么方式来解码。
响应比较简单,他不需要考虑你之前发的什么请求方式。 也不管你客户端浏览器用什么进行编码。
1.两句话
response.setCharacterEncoding(“UTF-8”)
仅仅是发送的浏览器的内容是UTF-8编码的,至于浏览器是用哪种编码方式显示不管。 所以当浏览器的显示编码方式不是UTF-8的时候,就会看到乱码,需要手动再进行一次设置。但是为了避免麻烦,我们可以在后台指定浏览器使用什么编码:
response.setContentType(“text/html;charset=UTF-8”);
2.一句话
response.setContentType(“text/html; charset=UTF-8”)
不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文。