我们平常说,java中char占2个字节,可又说汉字在不通的编码格式中所占的位数是不同的,比如gbk中汉字占2个字节,utf8中多数占3个字节,少数占4个。而所有汉字在java程序中我们都可以简单的用 char c = '字' 表示; 那么问题来了,在java程序运行的时候,究竟汉字占几个字节呢?

--------------------------

在讨论这个问题之前,我们需要先区分unicode和UTF。

1、unicode :统一的字符编号,仅仅提供字符与编号间映射。符号数量在不断增加,已超百万。详细:[

https://zh.wikipedia.org/zh-cn/Unicode]

2、UTF :unicode转换格式 (unicode transformation format) 。定义unicode中编号的编码方式。utf8和utf16便是其中两种实现方式。其中utf8为变长表示,长度可能时1~6个字节;utf16为变长表示,长度可能是2或4个字节。详细:UTF8 [

https://zh.wikipedia.org/zh-cn/UTF-8] UTF16 [

https://zh.wikipedia.org/zh-cn/UTF-16]

接着,要分清内码(internal encoding)和外码(external encoding)。

1、内码 :某种语言运行时,其char和string在内存中的编码方式。

2、外码 :除了内码,皆是外码。

要注意的是,源代码编译产生的目标代码文件(可执行文件或class文件)中的编码方式属于外码。

先看一下内码

JVM中内码采用UTF16。早期,UTF16采用固定长度2字节的方式编码,两个字节可以表示65536种符号(其实真正能表示要比这个少),足以表示当时unicode中所有字符。但是随着unicode中字符的增加,2个字节无法表示所有的字符,UTF16采用了2字节或4字节的方式来完成编码。Java为应对这种情况,考虑到向前兼容的要求,Java用一对char来表示那些需要4字节的字符。所以,java中的char是占用两个字节,只不过有些字符需要两个char来表示。

详细:

外码

Java的class文件采用UTF8来存储字符,也就是说,class中字符占1~6个字节。

Java序列化时,字符也采用UTF8编码,占1~6个字符。

总结:

1、java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节,但是某些字符需要两个char来表示。所以,一个字符会占用2个或4个字节。

2、java中外码中char使用UTF8的方式编码,一个字符占用1~6个字节。

3、UTF16编码中,英文字符占两个字节;绝大多数汉字(尤其是常用汉字)占用两个字节,个别汉字(在后期加入unicode编码的汉字,一般是极少用到的生僻字)占用四个字节。

4、UTF8编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。

----------------------------------------------

综上,java运行时采用utf16编码,多数汉字占2个字节,一个char就够了,少数占4个字节,需要两个char来表示。

说明:utf16中,通常汉字2字节,CJKV扩展B区、扩展C区、扩展D区的汉字占4个字节。

java char是几个字节_关于java中char占几个字节,汉字占几个字节相关推荐

  1. java中char是几个字节_关于java中char占几个字节,汉字占几个字节

    我们平常说,java中char占2个字节,可又说汉字在不通的编码格式中所占的位数是不同的,比如gbk中汉字占2个字节,utf8中多数占3个字节,少数占4个.而所有汉字在java程序中我们都可以简单的用 ...

  2. java class 转 字节_[转]JAVA字节数据与JAVA类型的转换

    一.JAVA进制类型转换 十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 In ...

  3. 蓝桥杯java能用编译器1吗_学java的你,这些英文单词都掌握了吗?

    1.Abstract class 抽象类:抽象类是不允许实例化的类,因此一般它需要被进行扩展继承. 2.Abstract method 抽象方法:抽象方法即不包含任何功能代码的方法. 3.Anonym ...

  4. java 必须try catch的异常_【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!...

    @ 1.异常 1.1 异常概念 异常 :简单说就是不正常运行,最终导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象.Java处 ...

  5. java 项目 q a 表设计_《JAVA程序设计项目案例训练》期末试卷(A卷)..doc

    献给Java专业期末考试复习的同学 希望你们能考个好成绩 2010-2011学年第二学期哈尔滨华夏计算机职业技术学院期末考试 JAVA程序设计项目案例训练试题(A卷) 总分题号一二三四核分人题分402 ...

  6. java取字符串倒数第二位_Java-字符串中char的倒数第二次出现 - java

    假设我有琴弦 String path = "the/quick/brown/fox/jumped/over/the/lazy/dog/"; 我想要以下输出 String outpu ...

  7. java下列语句正确的是_下列Java语句中,不正确的一项是( )。

    [多选题]装卸搬运机械具有( )功能 [判断题]char[] str="abcdefgh"; ( ) [单选题]7.关于内部类,下列说法不正确的是( ). [单选题]下列关于Jav ...

  8. java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)

    1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 注意:垃圾回 ...

  9. java jre 与jdk的区别_学习java却不知道JRE和JDK的区别?看完这篇文章,让你受益匪浅...

    JRE和JDK的区别? 1.JRE是Java运行时环境 . 它是运行已编译的Java程序所需的所有程序的包,包括Java虚拟机(JVM),Java类库, java命令和其他基础结构. 但是,它不能用于 ...

最新文章

  1. 删除临时表并且插入数据
  2. ssm三大框架工作原理_蒸发器最常见的三大工作原理
  3. Java——网络编程三要素
  4. RegexDemo6
  5. rust盖错了怎么拆除_细说Rust错误处理
  6. windows10双系统安装ubuntu18.04
  7. 【插件发布】JAVA微服务框架,Jeecg-P3-Demo 1.0.0 插件开源发布
  8. Catch That Cow(POJ-3278)
  9. php在线编辑器fckeditor,[原创]继续给力:PHP中使用FckEditor在线编辑器详解
  10. 什么是 “动态规划” , 用两个经典问题举例。
  11. LQR控制算法推导以及简单分析
  12. DIY智能战车制作教程,开启你的造车之旅
  13. Pascal语言学习手册 Inno Setup 学习资料大全
  14. 什么是自媒体、自媒体平台???
  15. 我的2019归零,2020走你
  16. 程序员杂谈:你还有梦想吗?
  17. 2021-3-18大学化学无机原理(3)热力学能与热力学第一定律
  18. CodeForces - [ACM-ICPC Jiaozuo Onsite A]Xu Xiake in Henan Province(模拟)
  19. mysql8.0源码分析——文件管理fil_system
  20. 计算机端口号65536,65536端口能不能用

热门文章

  1. 推荐几个有用的电子书供下载
  2. 微信有多少服务器支撑,终于支持多设备同时在线 微信新版本详细体验
  3. Chrome 缓存文件路径在哪
  4. 通过手机数据线与电脑共享网络
  5. 【论文阅读】AI20 A Dirichlet process biterm-based mixture model for short text stream clustering
  6. 树莓派PICO -oled详细避坑指导
  7. 生成微信小程序二维码(携带参数跳转指定页面)
  8. 月光族的两天生活--传说哥月月光
  9. SQLServer2008服务无法启动
  10. html如何让链接下划线消失,css让超链接不加下划线?