我们平常说,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. 8个计算机视觉深度学习中常见的Bug
  2. java treeset原理_Java集合 --- TreeSet底层实现和原理(源码解析)
  3. Windows Server 2012 R2工作文件夹⑤:创建工作文件夹
  4. 构造代码块会想你所想
  5. 同样是面对失败的责任:任春雷比杜一楠更有种
  6. php获取cpu编码,PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
  7. bzoj 4247: 挂饰(DP)
  8. 删除Flex Builder中没用的工作空间
  9. 波束形成(最大信噪比准则、LCMV、MSC、LMS、RLS)
  10. win10分辨率不能调整_win10常规问题解决方案
  11. 如何判断患者服用的温度敏感性药品依旧安全有效?
  12. 计算机英语ppt答辩,急求英语答辩PPT范文
  13. Linux学习笔记2—常见指令的使用
  14. Kubernetes (K8s) 安装部署过程(七)之部署node节点
  15. Word插入的表格怎么合并单元格
  16. 在本地如何启动Vue项目
  17. 2022-2027年中国安防智能化行业市场全景评估及发展战略规划报告
  18. kali2020.1中文字体乱码/kali乱码/汉化
  19. 飞猪、去哪儿网被列入大数据“杀熟”名单,超50%的人遭遇过被“杀熟”
  20. nginx服务器网站目录浏览,Nginx开启目录浏览功能 | 系统运维

热门文章

  1. 亚马逊推送 ios_每日新闻摘要:亚马逊免费一日寄送
  2. 安装破解Navicat
  3. 阿里云OSS搭建图床
  4. 零基础,初学者之 ---伤害门,激光门的制作;玩家获得道具,获得吸金币功能
  5. Linux下Samba服务器的搭建
  6. html自动换行span,HTMLspan标签如何做到自动换行?HTMLspan标签的用法介绍
  7. redis有序集合sorted set(zset)数据类型相关命令介绍及使用
  8. 如何开通股票接口中的StockQuoteRecord功能?
  9. MDT 评测 — OPPO Reno 标准版屏幕素质报告
  10. 【SI好文翻译】铜箔表面纹理对损耗的影响:一个有效的模型(四)