黑马程序员技术交流社区

标题: 中文与编码问题 [打印本页]

作者: qixing0918    时间: 2013-10-29 15:12
标题: 中文与编码问题
本帖最后由 qixing0918 于 2013-10-31 15:59 编辑

在java中char有两个字节  char='a'; char='你'   
a占一个字节(另外8位不用) 而 中文是把16位都用了才能表示一个汉字

汉字字符 2字节
英文字符 1字节
中文标点 2字节
英文标点 1字节

中国字比较复杂,1字节=8位,8位从0000 0000到1111 1111只能表示256个字符,2个字节是2*8=16位,从0000 0000 0000 0000到1111 1111 1111 1111可以表示65535个字符。
6万多个足以表示我们经常用的那些字了。所以我们用2字节表示汉字。如果用3个字节有很多不常用的字又占了很多不必要的存储空间,所以我们用2个字节而不是1个或者3个表示汉字的国际码。

什么时候出现乱码
1. 假如你用fileReader 读一个文本文件 这个文本文件用的是Utf-8 这样就会出现乱码 因为fileReader用的是默认GBK的编码 你用GBK去解码UTF-8的文本就会乱码
底层是 读两个字节去查GBK码表  但是UTF-8是3个字节一个汉字 你两个字节去查码表一定会乱码

2.乱码与系统没关系(java跨平台的)
只与编码和解码有关 解码就是把2进制数变成汉字(要去查码表) 编码是把汉字变成2进制(同样要去查码表) 但如果查的码表不同就会乱码

老外 ASCII 码  没有中文都是 abc...
中国  GB2312--->GBK---->GB18030 中文两个字节
所有人 unicode--->UTF_8 中文三个字节
三个字节比两个字节浪费空间 所以很多人都愿意用GBK





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2