前言:上一篇文章写了关于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);}}

运行结果如下:

在前一篇文章的基础上,我们来分析一下运行结果。

  1. “中”字的unicode码值为4E2D,使用UTF-8编码占3个字节。由于该字符位于BMP内,所以使用UTF-16编码应该占2个字节,但是运行结果为4个字节。
  2. 第二个字符(csdn编辑器不支持该字符的显示),该字符使用UTF-8应该占4个字节,运行结果正确。由于该字符位于BMP外,所以使用UTF-16编码应该占4个自己,但是运行结果显示占用了6个字节。
  3. 英文字母a,UTF-8编码应该和ASCII编码相同占用一个字节,运行结果显示占用一个字节。a在Unicode中位于BMP内,所以UTF-16编码应该占用4个字节,但是运行结果缺显示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编码字符所占字节数相关推荐

  1. java中8种数据类型和默认值所占字节数

    java 8种基本数据类型的默认值及所占字节数 通过一段代码来测试一下 8种基本数据类型的默认值 1 package dierge; 2 3 public class Ceshi { 4 int a; ...

  2. c语言中大写英文字母所占字节,Java中字符编码和字符串所占字节数 .

    首 先,java中的一个char是2个字节.java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~12 ...

  3. 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  语 ...

  4. java 基本数据类型所占字节数及其范围

    java学习笔记:java 基本数据类型所占字节数及其范围 所占字节数 类型范围 浮点数可表示的范围非常大,float类型可最大表示3.4 x 10^38 ,而double类型可最大表示1.79 x ...

  5. c语言中布尔类型占几个字节,JAVA基本数据类型所占字节数是多少?

    byte     1字节 short    2字节 int      4字节 long     8字节 char     2字节(C语言中是1字节)可以存储一个汉字 float    4字节 doub ...

  6. java 数字 字母 中文_java中英文字母、数字、中文所占字节数

    先了解下基本的单位: 1.比特(bit)即一个二进制位,例如100011就是6比特. 2.字节(byte),这是计算机中数据类型最基本的单位了,8bit组成1byte. java要确定每种基本类型所占 ...

  7. JAVA基本数据类型所占字节数是多少?

    byte     1字节                short    2字节                int      4字节                long     8字节     ...

  8. java 字符类型 字节数_JAVA基本数据类型所占字节数是多少?

    byte     1字节 short    2字节 int      4字节 long     8字节 char     2字节(C语言中是1字节)可以存储一个汉字 float    4字节 doub ...

  9. 各类编码格式中汉字和字母所占字节数

    编码格式: 1.ASII:美国标准信息交换码,用一个字节的7位可以表示: 2.ISO8859-1:拉丁码表,欧洲码表,用一个字节的8位可以表示: 3.GBK2312:中国的中文编码表,最多两个字节编码 ...

最新文章

  1. usb linux 内核,Linux下USB内核之学习笔记
  2. 2021年春季学期-信号与系统-第六次作业参考答案-第七小题
  3. 基于直方图均衡化的激光水下图像处理
  4. CSS画基本图形——圆
  5. 对产品经理而言,有一种灾难叫“老板说”
  6. 手写自己的MyBatis框架-支持插件
  7. 图解Go语言内存分配
  8. 这10道springboot常见面试题你需要了解下 1
  9. Swift - 循环强引用,内存泄漏
  10. C程序设计基础之多维数组的指针变量
  11. 【转】php eval函数用法----PHP中eval()函数小技巧
  12. 机器学习中的数学基础
  13. 我的世界php motd,ColorMOTD 彩色字体插件 | 我的世界 | MC世界侠
  14. C++项目经验(6)——yaml-cpp的安装、报错解决及使用
  15. 关于 AI 的数百个问题,清华男神刘云浩教授的 3 万字回复给整得明明白白|附抽奖送书...
  16. 五类/超五类/六类/超六类/七类等多类网线的比较
  17. Vscode的beautify插件使用
  18. 宠物商店信息管理系统
  19. s3c2440 uboot 移植 (四)支持环境变量在nandflash 存储
  20. 单片机——C51实验含Proteus仿真(独立键盘,矩阵键盘)

热门文章

  1. 证件照换底色·网页图片设计·第一次项目技术总结
  2. pandas DataFrame 直接生成plot图片 pandas.DataFrame.plot()
  3. 作为一名女程序员是什么体验?
  4. linux qt 找不到 lgl,Linux Qt cannot find -lGL错误完美解决方案(亲测有效)
  5. Maven 设置项目编码
  6. 讯飞AIUI集成语音语义的21003错误
  7. Granafa监控仪表盘:自定义简约型-只显示资源总览,各个主机详情
  8. 【强化学习】什么是强化学习算法?
  9. pandas实现股票日线数据转周线,月线等
  10. PDF格式转换WPS格式如何实现