Java中的UTF-8、UTF-16编码字符所占字节数
前言:上一篇文章写了关于Unicode,以及utf-8、utf-16相关知识。所以本篇博文来验证在java环境下,字符在不同编码下所占的字计数。
测试代码如下:
package string;public class CharByteTest {public static void main(String[] args) throws Exception {// 第二个字符为BMP之外的字符,csdn编辑器无法显示该字符,可以在运行结果截图中看到String[] strArr = {"中", "��", "a", "aa"};String[] charsetArr = {"gbk", "utf-8", "utf-16", "gb2312"};for(String str : strArr) {System.out.println(str);for(String charset : charsetArr) {byteTest(str, charset);}System.out.println("============================");}}public static void byteTest(String str, String charset) throws Exception {System.out.println("编码:" + charset + "\t所占字节数:" + str.getBytes(charset).length);}}
运行结果如下:
在前一篇文章的基础上,我们来分析一下运行结果。
- “中”字的unicode码值为4E2D,使用UTF-8编码占3个字节。由于该字符位于BMP内,所以使用UTF-16编码应该占2个字节,但是运行结果为4个字节。
- 第二个字符(csdn编辑器不支持该字符的显示),该字符使用UTF-8应该占4个字节,运行结果正确。由于该字符位于BMP外,所以使用UTF-16编码应该占4个自己,但是运行结果显示占用了6个字节。
- 英文字母a,UTF-8编码应该和ASCII编码相同占用一个字节,运行结果显示占用一个字节。a在Unicode中位于BMP内,所以UTF-16编码应该占用4个字节,但是运行结果缺显示4个字节。
- 按照上面的运行结果,a在UTF-8编码下占用1个字节,在UTF-16编码下占用4个字节。那么猜测两个英文字母a,即”aa“在UTF-8和UTF-16编码下应该分别占2个和8个字节,但是运行结果却和想象中的不一样,aa在UTF-16编码下工占6个字节。
运行结果好像和上一篇中讲到的有点不相符啊!为什么会出现这样的结果的?
通过搜索相关文章,了解到java的字节码文件(.class)文件采用的是UTF-8编码,但是在java 运行时会使用UTF-16编码。在转码的时候会在前面加上表示字节顺序的字符,这个字符称为”零宽度非换行空格”(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。FEFF占用两个字节,所以就解释了为什么java环境下英文字母a在UTF-16编码占3个字节。
我们不妨将这些字符的在不同编码下的二进制转换为16进制并打印出来。
将代码修改如下:
package string;public class CharByteTest {private static char[] HEX_CHAR = {'0', '1', '2', '3', '4','5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};public static void main(String[] args) throws Exception {String[] strArr = {"中", "��", "a", "aa"};//String[] charsetArr = {"gbk", "utf-8", "utf-16", "gb2312"};String[] charsetArr = {"unicode", "utf-8", "utf-16", "utf-16BE", "utf-16LE"};for(String str : strArr) {System.out.println(str);for(String charset : charsetArr) {byteTest(str, charset);}System.out.println("============================");}}public static void byteTest(String str, String charset) throws Exception {byte[] strByte = str.getBytes(charset);System.out.println("编码:" + charset + "\t所占字节数:" + strByte.length+ "\t16进制:" + bytesToHexStr(strByte));}// 将byte[]用十六进制字符串public static String bytesToHexStr(byte[] bytes) {int index = 0;char[] hexChar = new char[bytes.length * 2];for(int i = 0; i < bytes.length; i++) {hexChar[index++] = HEX_CHAR[bytes[i] >> 4 & 0xF];hexChar[index++] = HEX_CHAR[bytes[i] & 0xF];}return new String(hexChar);}}
运行结果:
Java中的UTF-8、UTF-16编码字符所占字节数相关推荐
- java中8种数据类型和默认值所占字节数
java 8种基本数据类型的默认值及所占字节数 通过一段代码来测试一下 8种基本数据类型的默认值 1 package dierge; 2 3 public class Ceshi { 4 int a; ...
- c语言中大写英文字母所占字节,Java中字符编码和字符串所占字节数 .
首 先,java中的一个char是2个字节.java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~12 ...
- java和C中基本数据类型的所占字节数对比
java 语言所占字节数 数据类型 32位计算机 64位计算机 byte 1 1 char 2 2 int 4 4 long 8 8 float 4 4 double 8 8 引用 4 8 c 语 ...
- java 基本数据类型所占字节数及其范围
java学习笔记:java 基本数据类型所占字节数及其范围 所占字节数 类型范围 浮点数可表示的范围非常大,float类型可最大表示3.4 x 10^38 ,而double类型可最大表示1.79 x ...
- c语言中布尔类型占几个字节,JAVA基本数据类型所占字节数是多少?
byte 1字节 short 2字节 int 4字节 long 8字节 char 2字节(C语言中是1字节)可以存储一个汉字 float 4字节 doub ...
- java 数字 字母 中文_java中英文字母、数字、中文所占字节数
先了解下基本的单位: 1.比特(bit)即一个二进制位,例如100011就是6比特. 2.字节(byte),这是计算机中数据类型最基本的单位了,8bit组成1byte. java要确定每种基本类型所占 ...
- JAVA基本数据类型所占字节数是多少?
byte 1字节 short 2字节 int 4字节 long 8字节 ...
- java 字符类型 字节数_JAVA基本数据类型所占字节数是多少?
byte 1字节 short 2字节 int 4字节 long 8字节 char 2字节(C语言中是1字节)可以存储一个汉字 float 4字节 doub ...
- 各类编码格式中汉字和字母所占字节数
编码格式: 1.ASII:美国标准信息交换码,用一个字节的7位可以表示: 2.ISO8859-1:拉丁码表,欧洲码表,用一个字节的8位可以表示: 3.GBK2312:中国的中文编码表,最多两个字节编码 ...
最新文章
- usb linux 内核,Linux下USB内核之学习笔记
- 2021年春季学期-信号与系统-第六次作业参考答案-第七小题
- 基于直方图均衡化的激光水下图像处理
- CSS画基本图形——圆
- 对产品经理而言,有一种灾难叫“老板说”
- 手写自己的MyBatis框架-支持插件
- 图解Go语言内存分配
- 这10道springboot常见面试题你需要了解下 1
- Swift - 循环强引用,内存泄漏
- C程序设计基础之多维数组的指针变量
- 【转】php eval函数用法----PHP中eval()函数小技巧
- 机器学习中的数学基础
- 我的世界php motd,ColorMOTD 彩色字体插件 | 我的世界 | MC世界侠
- C++项目经验(6)——yaml-cpp的安装、报错解决及使用
- 关于 AI 的数百个问题,清华男神刘云浩教授的 3 万字回复给整得明明白白|附抽奖送书...
- 五类/超五类/六类/超六类/七类等多类网线的比较
- Vscode的beautify插件使用
- 宠物商店信息管理系统
- s3c2440 uboot 移植 (四)支持环境变量在nandflash 存储
- 单片机——C51实验含Proteus仿真(独立键盘,矩阵键盘)
热门文章
- 证件照换底色·网页图片设计·第一次项目技术总结
- pandas DataFrame 直接生成plot图片 pandas.DataFrame.plot()
- 作为一名女程序员是什么体验?
- linux qt 找不到 lgl,Linux Qt cannot find -lGL错误完美解决方案(亲测有效)
- Maven 设置项目编码
- 讯飞AIUI集成语音语义的21003错误
- Granafa监控仪表盘:自定义简约型-只显示资源总览,各个主机详情
- 【强化学习】什么是强化学习算法?
- pandas实现股票日线数据转周线,月线等
- PDF格式转换WPS格式如何实现