我们平常说,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中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...

    [多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...

  3. java中的基本数据类型和运算符_【Java基础】基本数据类型和运算符

    基本数据类型: 数值型: 整型: ① byte,1byte = 8bit(8位),储存是有符号的,以二进制补码表示的整数. 最小值为-128,最大值为127,默认值为0. byte在大型数组中可以显著 ...

  4. char数组转换成字符串_将字符串转换为char数组java –将字符串转换为char

    char数组转换成字符串 Sometimes we have to convert String to the character array in java programs or convert ...

  5. java 中的finally你知多少_「JAVA」详述Java异常体系,处理异常时配上finally效果更佳...

    什么是异常 从事Java开发的小伙伴对于"异常"应该不陌生,因为每天都会遇到不少异常,或捕获,或抛出.那究竟什么是异常?异常即非正常的,不同于平常.一般化的情况.在平时生活中,医生 ...

  6. JAVA共有几种窗体布局方式_在Java GUI程序开发中常见的三种布局管理器是什么

    答:FlowLayout 流式布局,从左到右,如果到边界就换行再从左到右. BorderLayout 边界布局(默认布局方式),按东西南北中五个方向来布局,默认是中.后设置在同样位置的控件会覆盖之前的 ...

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

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

  8. java两个文件夹比较路径_比较Java中两个文件的路径

    java两个文件夹比较路径 Given the paths of the two files and we have two compare the paths of the files in Jav ...

  9. Java中脚手架是干什么用的_构建java web脚手架

    前言 程序员无论使用哪种语言进行开发,如果想更快地完成任务,使用一个趁手的ide是第一步,这里我推荐使用IntelliJ IDEA.具体原因我不多说了,大家可以尝试用用看看是不是很贴合程序员的需求.第 ...

最新文章

  1. “ Error:(1, 1) java: 非法字符: ‘\ufeff‘ ”错误的解决方法
  2. 【LeetCode】142 - Linked List Cycle II
  3. mega_[MEGA DEAL] Android课程的Java基础知识(61%折扣)
  4. Oracle中的within,Oracle函数 --聚合函数中的语法within group
  5. linux 网络通讯 命令,Linux—网络通讯管理命令
  6. C++ STL 优先队列
  7. 京东2016校招编程题
  8. 英特尔x722网卡驱动_产品详情 | 从核心到边缘,英特尔加速5G网络基础设施建设...
  9. 聊一下CPU占用高的解决方案
  10. 深入理解== 和 equals 的区别
  11. 最优化学习笔记(十六)——拟牛顿法(2)
  12. linux 将当前时间往后调整2分钟_Python处理时间序列常用方法汇总
  13. Memcached的几种Java客户端(待实践)
  14. ERwin Data Modeler数据库建模工具使用纪要
  15. 2021年全球及中国AMOLED行业发展现状、竞争格局及未来发展趋势分析,柔性AMOLED面板将占领市场「图」
  16. 表格自动填充上一行_如何在Google文档电子表格上使用自动填充[快速提示]
  17. 迁徙数据平台简单介绍
  18. WPF 简易手绘笔迹支持回放的方法
  19. mysql orm_从MySQL到ORM(二):MySQL基础
  20. azw3电子书如何用MAC打开?

热门文章

  1. 在线听歌房源码 - MKOnlineMusicPlayer V2.4.1
  2. 高瓴资本张磊:在人生的道路上,选择与谁同行,比要去的远方更重要
  3. Eclipse乱码怎么办
  4. VMWare和Virtual PC虚拟机的比较
  5. java重写clone()方法
  6. 十大累成狗的大学专业排名,第一名我服!
  7. homebrew/brew解决命令卡死的问题,brew update慢、卡死
  8. 电脑端操作Android手机截图并上传
  9. 田汉桥承诺12月份发放工资 健奔奥体育产业(武汉)有限公司员工再度受骗
  10. 快速分析圆通快递物流,并筛选出一天未更新的单号