java中一个字符是几个字节?字符和字节是同等的吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中一个字符是几个字节?字符和字节是同等的吗?相关的知识,希望对你有一定的参考价值。

Java规定了字符的内码要用UTF-16编码,一个字符是2个字节。外码字符所占字节取决于具体编码。字符和字节是不一样的。

外码编码不同,字符和字节的换算不同,几种常见的编码换算如下:

ASCII编码是单字节编码,只有英文字符,不能编码汉字。

GBK编码1个英文字符是1个字节,一个汉字是是2个字节。

UTF-8编码1个英文字符是1个字节,一个汉字是3个字节。

Unicode编码1个英文字符是2个字节,一个汉字是2个字节。

扩展资料

汉字编码的困难点 汉字进入计算机,有许多困难,其原因主要有三点:

①数量庞大:一般认为,汉字总数已超过6万个(包括简化字)。虽有研究者主张规定3000多或4000字作为当代通用汉字,但仍比处理由二三十个字母组成的拼音文字要困难得多。

②字形复杂:有古体今体,繁体简体,正体异体;而且笔画相差悬殊,少的一笔,多的达36笔,简化后平均为9.8笔。

③存在大量一音多字和一字多音的现象:汉语音节416个,分声调后为1295个(根据《现代汉语词典》统计,轻声39个未计)。以1万个汉字计算,每个不带调的音节平均超过24个汉字,每个带调音节平均超过7.7个汉字。有的同音同调字多达66个。一字多音现象也很普遍。

参考资料来源:百度百科-编码

参考技术A 字符 不等于 字节。
字符(char)是 Java 中的一种基本数据类型,由 2 个字节组成,范围从 0 开始,到 2^16-1。
字节是一种数据量的单位,一个字节等于 8 位。所有的数据所占空间都可以用字节数来衡量。例如一个字符占 2 个字节,一个 int 占 4 个字节,一个 double 占 8 个字节 等等。本回答被提问者采纳
参考技术B 字符所占的字节数是要看编码集的,不同的编码,一个字符占的字节数也不同。 参考技术C java字符采用的是统一码(Unicode),它是一种16位编码方案,支持世界不同语言的文本交换,处理,和显示。Unicode占两个字节。另外一种常用编码方案是ASCII,占一个字节。提一下,java中也可以使用ASCII字符。存储不同长度的东西java会用不同的存储长度来提高存储利用率。
字符是指计算机中使用的字母、数字、字和符号,如:1、2、3、A、B、C
字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制。
存储字符需要占空间,这个空间的大小就是用字节来描述的。

编码解码

一、
文件:字节流,字符流。
字节流:直接将在JVM中处理的unicode的byte[]存入到文件,有数值和字符数据之分(即数值几个字节,字符是几个字节等);
字符流:会将unicode的byte[](包括数值和字符),转换成默认编码(utf-8)的byte[],然后存入到文件。

字符--》字节byte[]--》字符
二、
java.class类的编码为:unicode;
Java的class文件采用utf8的编码方式,JVM运行时采用utf16。Java的字符串是unicode编码。
windows 默认的编码为:中文:gb2312; 英文:iso8859;
"中文",unicode存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4".如果charset为"utf8"则最后是"e4 b8 ad e6 96 87".如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)

1,文件,JVM,文件都是以字节码(byte[])进行处理的,我们看到字符是byte[]通过对应的编码方式映射的。
2,不同编码对byte[]的处理方式不同,对应的映射也不相同。体会由utf8的byte[]编码到unicode的byte[],再由unicode的byte[]解码到utf8的byte[]
3,两层管理,一层:不同编码的byte[],不同编码的byte[]可以通过unicode的byte[]进行转换;二层:每种编码的byte[]怎么对应我们看到的字符

Java采用的编码:unicode,JVM平台默认字符集和外部资源的编码:
文件:utf8的byte[]
JVM:utf8的byte[]转化为unicode的byte[]
文件:需要将unicode的byte[]以哪种编码的byte[]进行存储到文件中

当没有明确指定需要使用的字符编码方案时,Java程序通过“java.nio.charset.Charset.defaultCharset().name()”语句来获取默认的字符编码方案,该语句返回的值跟运行Java程序的操作系统的设置有关,在有些操作系统上,该语句返回值可能是UTF8;在有些操作系统上,该语句返回值可能是GBK;在有些操作系统上,该语句返回值可能是除了UTF8和GBK以外的其他字符编码方案。这样子,程序的可移植性大大降低。

两层结构:由字节流,到编码的字节流,编码映射字符
JVM里面的任何字符串资源都是Unicode,就是说,任何String类型的数据都是Unicode编码。没有例外。既然只有一种编码,那么,我们可以这么说,JVM里面的String是不带编码的。String相当于char[]。
JVM里面的 byte[] 数据是带编码的。比如,Big5,GBK,GB2312,UTF-8之类的。
一个GBK编码的byte[] 转换成 String,其实就是从GBK编码向Unicode编码转换。
一个String转换成一个Big5编码的byte[],其实就是从Unicode编码向Big5编码转换。
所以,Unicode是所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。这样构成了一个总线结构。

byte是字节,字符串在网络传输或存储前需要转换为byte数组。在从网络接收或从存储设备读取后需要将byte数组转换成String。String是字符串,可以看成是由char组成的数组。String和char为内存形式,byte是网络传输或存储的序列化形式。

String序列化成byte数组或byte反序列化为String时需要选择正确的编码方式。如果编码方式不正确,就会得到一些0x3F的值。常用的字符编码方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。

所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 
字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化这两个之间通过InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的 

以上是关于java中一个字符是几个字节?字符和字节是同等的吗?的主要内容,如果未能解决你的问题,请参考以下文章

一个空格占多少个字符?

数据库中日期型数据的长度是几个字节

unicode 是几个字节?

unicode字符集是几个字节表示一个字符?为啥需要utf-8?

delphi中一个数字占用几个字节???

一个汉字到底是多少个字符,高手请进