java中char是几个字节_关于java中char占几个字节,汉字占几个字节
我们平常说,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占几个字节,汉字占几个字节相关推荐
- java char是几个字节_关于java中char占几个字节,汉字占几个字节
我们平常说,java中char占2个字节,可又说汉字在不通的编码格式中所占的位数是不同的,比如gbk中汉字占2个字节,utf8中多数占3个字节,少数占4个.而所有汉字在java程序中我们都可以简单的用 ...
- 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...
[多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...
- java中的基本数据类型和运算符_【Java基础】基本数据类型和运算符
基本数据类型: 数值型: 整型: ① byte,1byte = 8bit(8位),储存是有符号的,以二进制补码表示的整数. 最小值为-128,最大值为127,默认值为0. byte在大型数组中可以显著 ...
- char数组转换成字符串_将字符串转换为char数组java –将字符串转换为char
char数组转换成字符串 Sometimes we have to convert String to the character array in java programs or convert ...
- java 中的finally你知多少_「JAVA」详述Java异常体系,处理异常时配上finally效果更佳...
什么是异常 从事Java开发的小伙伴对于"异常"应该不陌生,因为每天都会遇到不少异常,或捕获,或抛出.那究竟什么是异常?异常即非正常的,不同于平常.一般化的情况.在平时生活中,医生 ...
- JAVA共有几种窗体布局方式_在Java GUI程序开发中常见的三种布局管理器是什么
答:FlowLayout 流式布局,从左到右,如果到边界就换行再从左到右. BorderLayout 边界布局(默认布局方式),按东西南北中五个方向来布局,默认是中.后设置在同样位置的控件会覆盖之前的 ...
- java class 转 字节_[转]JAVA字节数据与JAVA类型的转换
一.JAVA进制类型转换 十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 In ...
- java两个文件夹比较路径_比较Java中两个文件的路径
java两个文件夹比较路径 Given the paths of the two files and we have two compare the paths of the files in Jav ...
- Java中脚手架是干什么用的_构建java web脚手架
前言 程序员无论使用哪种语言进行开发,如果想更快地完成任务,使用一个趁手的ide是第一步,这里我推荐使用IntelliJ IDEA.具体原因我不多说了,大家可以尝试用用看看是不是很贴合程序员的需求.第 ...
最新文章
- “ Error:(1, 1) java: 非法字符: ‘\ufeff‘ ”错误的解决方法
- 【LeetCode】142 - Linked List Cycle II
- mega_[MEGA DEAL] Android课程的Java基础知识(61%折扣)
- Oracle中的within,Oracle函数 --聚合函数中的语法within group
- linux 网络通讯 命令,Linux—网络通讯管理命令
- C++ STL 优先队列
- 京东2016校招编程题
- 英特尔x722网卡驱动_产品详情 | 从核心到边缘,英特尔加速5G网络基础设施建设...
- 聊一下CPU占用高的解决方案
- 深入理解== 和 equals 的区别
- 最优化学习笔记(十六)——拟牛顿法(2)
- linux 将当前时间往后调整2分钟_Python处理时间序列常用方法汇总
- Memcached的几种Java客户端(待实践)
- ERwin Data Modeler数据库建模工具使用纪要
- 2021年全球及中国AMOLED行业发展现状、竞争格局及未来发展趋势分析,柔性AMOLED面板将占领市场「图」
- 表格自动填充上一行_如何在Google文档电子表格上使用自动填充[快速提示]
- 迁徙数据平台简单介绍
- WPF 简易手绘笔迹支持回放的方法
- mysql orm_从MySQL到ORM(二):MySQL基础
- azw3电子书如何用MAC打开?