java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别

在平常工作中使用到char和byte的场景不多,但是如果项目中使用到IO流操作时,则必定会涉及到这两个类型,下面让我们一起来回顾一下这两个类型吧。

char和byte的对比

byte

byte 字节,数据存储容量1byte,byte作为基本数据类型表示的也是一个存储范围上的概念,有别于int、long等专门存数字的类型,这种类型的大小就是1byte,而int是4byte。

存数字的话就是1byte=8位,2^8=256 即-128-127。字符的话包括字母和汉字,一个字母是1byte,一个汉字2byte。也就是可以用byte变量去存储一个英文字符,但是却存不下一个中文汉字,因为一个汉字占2byte。

总结,byte是java中的一个基本数据类型,这个数据类型的长度是1byte,此byte就是彼byte,即是基本数据类型也是存储空间的基本计量单位。

char

char是Java中的保留字,与别的语言不同的是,char在Java中是16位的,因为Java用的是Unicode。不过8位的ASCII码包含在Unicode中,是从0~127的。

Java中使用Unicode的原因是,Java的Applet允许全世界范围内运行,那它就需要一种可以表述人类所有语言的字符编码。Unicode。

char本质上是一个固定占用两个字节的无符号正整数,这个正整数对应于Unicode编号,用于表示那个Unicode编号对应的字符。

由于固定占用两个字节,char只能表示Unicode编号在65536以内的字符,而不能表示超出范围的字符。

Unicode和UTF-8的对比

Unicode

需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

比如,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

这里就有两个严重的问题,第一个问题是,如何才能区别Unicode和ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

它们造成的结果是:1)出现了Unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示Unicode。2)Unicode在很长一段时间内无法推广,直到互联网的出现。

UTF-8

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。

以utf8为例,utf8是一个变长编码标准,可以以1~4个字节表示一个字符,而中文占3个字节,ascII字符占1个字节。

为什么我们在java里面可以用一个char来表示一个中文呢?

因为java是以unicode作为编码方式的。unicode是一个定长的编码标准,每个字符都是2个字节,也就是1个char类型的空间。

在编译时会把utf8的中文字符转换成对应的unicode来进行传输运算。

示例代码

package com.lingyejun.io;

import java.io.UnsupportedEncodingException;

/**
 * Created by Lingye on 2018/9/28 14:34
 */
public class ChineseCharCode {

    public static void main(String[] args) {
        String str = "中";
        char c = ‘中‘;
        // java使用unicode编码,一个字符占两个字节
        System.out.println("char字符 中 二进制"+Integer.toBinaryString(c));
        try {
            // UTF-8是Unicode的实现方式之一
            System.out.println(str.getBytes("UTF-8").length);
            // UTF-16也是Unicode的实现方式之一,但使用较少
            System.out.println(str.getBytes("UTF-16").length);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

原文地址:https://www.cnblogs.com/lingyejun/p/9743788.html

时间: 2024-11-05 19:40:48

java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别的相关文章

向Java枚举类型中添加新方法

除了不能继承enum之外,可将其看做一个常规类.甚至可以有main方法. 注意:必须先定义enum实例,实例的最后有一个分号. 下面是一个例子:返回对实例自身的描述,而非默认的toString返回枚举实例的名字. public enum Color { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String nam

Java基础学习中一些词语和语句的使用

在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看break和continue使用和运行效果的额说明: break:关键字,可以用于任何循环体控制结构,在循环体内执行时,当执行到break时循环会立即终止,并跳到此循环体以后的语句执行. 列如:输出0--10的数当输出到第六位时就不在继续输出了,即是跳出for循环执行for循环体以后的一句. public

Java基础(中)

1.程序运行流程 a.顺序结构:如果代码里没有流程控制,程序是至上而下一行一行执行的,一条语句执行完之后继续执行下一条语句,直到程序的最后. b.分支结构(条件结构):if;switch.switch选择的类型只有四种:byte\short\int\char(java5之前),还支持enum(jdk5),string(jdk7). c.循环结构: while:事先不需要知道循环执行多少次: do while:同上,只是至少要执行一次(先做,后判断): for:需要知道循环次数: d.break,

java基础类型包装类与自动打包解包

一基础类型包装类 基础数据类型存放在内存的栈区域,可以通过包装类将基础数据类型转换为引用数据类型,即存储在堆与栈中. 基础数据类型一共有8种,相对应的包装类也有8种.分别是Byte,Short,Integer,Long,Float,Double,Character,Boolean.类 包装类位于java.Lang包中. 1 public class Test1 { 2 3 public static void main(String[] args) { 4 // TODO Auto-genera

Java基础类型自动装箱(autoboxing)

Java SE 1.5 版本及之后,开始提供自动装箱功能. 自动装箱,将基础类型“包装”成一种类型: 基本类型 -->  包装器类 如下过程可触发自动装箱过程: Integer count = 1; Double amount = 2.0D 从 Javadoc API 上看,包装器类提供方法,对封装的基础类型进行操作: 类型转换,如 float --> int 比较 ... 值得注意的是,对于 [-128, 127] 之间的数值,自动装箱利用缓存提供内存使用效率. 即,自动装箱对于该范围的数值

有关JAVA基础学习中的集合讨论

    很高兴能在这里认识大家,我也是刚刚接触后端开发的学习者,相信很多朋友在学习中都会遇到很多头疼的问题,希望我们都能够把问题分享出来,把自己的学习思路整理出来,我们一起探讨一起成长.    今天我在这里简单讲解一下我对学习中集合的理解.很多朋友再写解释的时候,没有从最简单说起,造成了阅读中的困惑,或许我能帮助你对集合有一个新的认识.   首先当我们谈到集合的时候要了解一下集合的具体概念. java集合的概念是相对于数组来说的,那么什么是数组呢?   数组:数组是一段连续存储单元. 每个存储单

黑马程序员----java基础笔记中(毕向东)

<p>------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! -------</p><p> </p><p>笔记一共记录了毕向东的java基础的25天课程,分上.中.下</p><p>本片为中篇,涵盖11-20天课程</p&

java基础随笔 字符数据类型char的单引号

public class Love{ public static void main(String[] args){ System.out.println('*'+'\t'+'*'); System.out.println("*"+"\t"+"*") } } 运行结果   第一行为  93 第二行为  *        * 原因 第一行中'\t' 单引号  识别为字符数据类型char,char类型是可以运算的,在第一行中+做了运算符. 第二行&q

向Java枚举类型中加入新方法

除了不能继承enum之外,可将其看做一个常规类.甚至能够有main方法. 注意:必须先定义enum实例.实例的最后有一个分号. 以下是一个样例:返回对实例自身的描写叙述,而非默认的toString返回枚举实例的名字. public enum Color { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String n