java用的是什么编码,java采用什么字符集
大家好,感谢邀请,今天来为大家分享一下java用的是什么编码的问题,以及和java采用什么字符集的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
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使用unicode为默认编码是什么意思
java初学者都会接触到一个概念,既java的默认编码是uincode,但书上也就出现这句话而已,究竟是什么意思就没再说。其实对于一个程序员来说,一个平台的编码方式是不用了解的,因为这是他内部处理字符的方式,和我们顶层设计程序是没有多大关系(如果真要说有关系的话,一个就是你对这个平台的熟悉程度,另一个就只能是你要处理的字符奇葩到要考虑编译器有没有包括这个字符)。但这并不是指我们在编程的时候完全不用考虑编码问题,恰恰相反,编码问题是跨系统交流的基本。
那java哪里会用到编码问题呢?最常见的是流,下面有两个例子。1.在linux下用java创建了一个文件(这里默认代码里没有指定编码),里面包括英文和中文,然后在windows下同样用java读取这个文件,并输出,结果中文出现了乱码;2.android手机和电脑的两个java程序进行类似qq的信息交流,中文都是乱码。疑惑来了,java不是跨平台吗,而且默认编码就是unicode,为什么会有编码?正如上面所说,java的系统编码是管理内部变量等信息的,是统一不能变的,但上面两个例子出现乱码的原因在于这些字符信息是从外界读取的,编码方式直接影响到字符的显示,比如gbk一个字符是1或2个字节,中文是2个,而utf8是1到4个字节不定,中文是3个,utf16是2个字节固定不变,所以很明显了,同样字节数的源信息可以每2个或者每3个字节表达一个中文,不同编码当然不同了,而且即使gbk和utf16都是两个字节表示一个中文,同样的二进制也对应不同的字符。所以从外部读取到这些byte信息后,就要指定编码,比如new
String(byte[],charset),当然,也可以在构建流的时候就指定,像new
InputStreamReader(InputStream,charset)等,但像BufferedReader等没有相应的构造函数,就只能把上面的InputStreamReader作为参数了。
1.String和流(包括控制台的输出输入)的默认编码是根据系统而定,即jvm假设这些信息是当前系统创建的,windows默认中文是gbk,linux和mac是utf8(这里又来了,utf8和unicode是什么意思,简单地说,unicode是把每个字符和一个唯一的二进制码对应的标准,而utf是unicode
transformation
format,即如何表示每个唯一的二进制码,utf8,utf16和utf32是不同的编码方式);
2.IDE设置的编码方式用于存取java源文件,对于在不同系统平台上共享代码很重要;
3.java编译器采用utf8,即class文件的存储是用utf8,因为相对于utf16,utf8在处理英文占用内存小,而程序大部分都是英文;
4.jvm运行时的编码方式是utf16,即jvm用utf8从class文件读取程序后再转化为utf16编码的字符串,因为utf16是2个字节,统一的长度更方便jvm申请数组等操作;
5.网页大部分是用utf8编码的,在html头几行有charset的信息,在对下载下来的网页进行解析时,要注意编码,谷歌百度在对搜索结果的解析时也是用utf8的,所以在涉及到网络时编码问题非常重要,本人曾经栽得很惨,当然了,谁叫windows的编码不是utf8;
6.不知大家有没有经历过,如果编码弄错了,一般只有中文会出现乱码,而中文后面的英文是正确的,不合理啊,这不是类似多骨诺米牌吗,一个错了,后面不是全倒吗。所以别小看那些制定编码的专家,像utf8每个字节的前几位都用来表示一些信息,不同字节还不一样,而utf16也有,所以弄出了utf16le和utf16be
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采用什么字符集的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!