java是什么编码格式(java采用什么字符集)
大家好,如果您还对java是什么编码格式不太了解,没有关系,今天就由本站为大家分享java是什么编码格式的知识,包括java采用什么字符集的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
java中Char到底是什么格式的编码
文本处理中经常有这样的逻辑:
String s= new String(bts,"UTF-8");
看String源代码,里面是一个char[],将bts按照某种编码方式,变成了char[],不经有个疑问:
使用UTF-8,UTF-16,ASIIC等encode出来的char是相同的么?char是byte按照什么编码方式生成的呢?
简单的办法,是看java序列化的实现方式,char最后是怎么序列化到byte[]中去的.
ObjectOutputStream oos= new ObjectOutputStream(fos);oos.writeChar('A');
看writeChar的内部实现
public void writeChar(int val) throws IOException{
bout.writeChar(val);
}
追到底层实现
调用了BlockDataOutputStream.writeChar方法,在看这个方法的内部实现
public void writeChar(int v) throws IOException{
if(pos+ 2<= MAX_BLOCK_SIZE){
Bits.putChar(buf, pos,(char) v);
pos+= 2;
} else{
dout.writeChar(v);
}
}
最终使用了Bits.putChar方法
static void putChar(byte[] b, int off, char val){
b[off+ 1]=(byte)(val);
b[off ]=(byte)(val>>> 8);
}
好吧,看到这里就清楚了,用的是UTF-16BE大端序编码方式。
回到最初的问题上
String s= new String(bts,"UTF-8");
这行代码的含义是什么呢?
是将bts按照UTF-8编码的方式获取到unicode的pointcode(就是unicode定义字符的序号),然后再将这个pointcode按照utf-16be的方式编码成char.//最终的实现方式,可能有差异,但是结果是没错滴^^
java采用什么字符集
Java语言所使用的字符集是16位Unicode编码。另外再介绍一些常见的字符集:
1、最早在dos下写pascal的时候,就遇到ASCII字符集,后来还是dos下写c,也是ascii字符集
特点:目前最通用的单字节编码字符集
表示:单字节
最早ascii用7bit表示,总共能表示2^7=128个字符,后来扩展到8bit,就表示2^8=256个字符
2、GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。
特点:当然是能表示99%的中国汉字,还包括拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母等
表示:双字节
3、GBK是汉字编码标准之一,全称《汉字内码扩展规范》,GBK向下与GB2312编码兼容,向上支持ISO10646.1国际标准。可以认为GBK是在GB2313基础上通过内码扩展出来的一个标准。
特点:完全兼容GB2312标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字
表示:双字节
4、Big5,台湾那边使用比较多。
5、GB 18030,全称是GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准。
特点:就是强大。覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。并且与Unicode 3.0版本兼容,填补Unicode扩展字符字汇“统一汉字扩展A”的内容。并且与以前的国家字符编码标准(GB2312,GB13000.1)兼容。
表示:单字节、双字节、四字节三种方式
6、Unicode野心更大(当然有一个国际统一标准当然是好事)
特点:Unicode是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
表示:utf-8,utf-16,utf-32
这里可能有点不好理解,举个例子
首先,把unicode理解成对所有字符做了一个统一的编号,比如:“字”这个字符,编号是23383,这个是unicode定义的
但是,在计算机中,如何存储这个编号呢?方式就有很多,存储unicode的方式,就是utf-8,utf-16,utf-32
23383数值的16进制表示:0x5b57
utf-8用3个字节来表示汉字,所以utf-8的表示为:0xE5AD97
utf-16用2个字节来表示汉字,所以utf-16的表示为:0x5b57刚好和数值是一样的
utf-32用4个字节来表示汉字,所以utf-32的表示为:0x00005b57和数值是一样的,不过浪费空间
7、再来讲讲utf-8,它是一种变长的字符集
表示:单字节来表示字母,双字节来表示一些希腊字母,三字节来表示汉字,当然也有四字节的
这么做当然会增加表示和识别的难度,不过,可以节省空间。这也是为什么utf-8在网络编码中流行的原因。
Java几种常见的编码格式
ASCII码
学过计算机的人都知道 ASCII码,总共有 128个,用一个字节的低 7位表示,0~31是控制字符如换行回车删除等;32~126是打印字符,可以通过键盘输入并且能够显示出来。
ISO-8859-1
128个字符显然是不够用的,于是 ISO组织在 ASCII码基础上又制定了一些列标准用来扩展 ASCII编码,它们是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1涵盖了大多数西欧语言字符,所有应用的最广泛。ISO-8859-1仍然是单字节编码,它总共能表示 256个字符。
GB2312
它的全称是《信息交换用汉字编码字符集基本集》,它是双字节编码,总的编码范围是 A1-F7,其中从 A1-A9是符号区,总共包含 682个符号,从 B0-F7是汉字区,包含 6763个汉字。
GBK
全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940个码位,它能表示 21003个汉字,它的编码是和 GB2312兼容的,也就是说用 GB2312编码的汉字可以用 GBK来解码,并且不会有乱码。
GB18030
全称是《信息交换用汉字编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与 GB2312编码兼容,这个虽然是国家标准,但是实际应用系统中使用的并不广泛。
UTF-16
说到 UTF必须要提到 Unicode(Universal Code统一码),ISO试图想创建一个全新的超语言字典,世界上所有的语言都可以通过这本字典来相互翻译。可想而知这个字典是多么的复杂,关于 Unicode的详细规范可以参考相应文档。Unicode是 Java和 XML的基础,下面详细介绍 Unicode在计算机中的存储形式。
UTF-16具体定义了 Unicode字符在计算机中存取方法。UTF-16用两个字节来表示 Unicode转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16个 bit,所以叫 UTF-16。UTF-16表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java以 UTF-16作为内存的字符存储格式的一个很重要的原因。
UTF-8
UTF-16统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。而 UTF-8采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6个字节组成。
UTF-8有以下编码规则:
如果一个字节,最高位(第 8位)为 0,表示这是一个 ASCII字符(00- 7F)。可见,所有 ASCII编码已经是 UTF-8了。
如果一个字节,以 11开头,连续的 1的个数暗示这个字符的字节数,例如:110xxxxx代表它是双字节 UTF-8字符的首字节。
如果一个字节,以 10开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节
Java中需要编码的场景
前面描述了常见的几种编码格式,下面将介绍 Java中如何处理对编码的支持,什么场合中需要编码。
I/O操作中存在的编码
我们知道涉及到编码的地方一般都在字符到字节或者字节到字符的转换上,而需要这种转换的场景主要是在 I/O的时候,这个 I/O包括磁盘 I/O和网络 I/O,关于网络 I/O部分在后面将主要以 Web应用为例介绍。
关于本次java是什么编码格式和java采用什么字符集的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。