博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
帮你理清Java中字符与字节的编码关系
阅读量:3982 次
发布时间:2019-05-24

本文共 1529 字,大约阅读时间需要 5 分钟。

转载请注明出处:

    首先,java中的一个char是2个字节。java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数系统中,一个char通常占1个字节,但是在0~127整数之间的字符映射,unicode向下兼容ASCII。而Java采用unicode来表示字符,一个中文或英文字符的unicode编码都占2个字节,但如果采用其他编码方式,一个字符占用的字节数则各不相同。

    在 GB 2312 编码或 GBK 编码中,一个英文字母字符存储需要1个字节,一个字符存储需要2个。 在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。在UTF-16编码中,一个英文字母字符存储需要2个字节,一个汉字字符储存需要3到4个字节(Unicode扩展区的一些汉字存储需要4个字节)。在UTF-32编码中,世界上任何字符的存储都需要4个字节。

   1、我的系统的默认编码方式为GBK,因此对于字符串 “你好hello”,

    如果调用length()方法返回其长度,得到的结果将为:7。该方法返回的是字符串的字符数,无论是中文字符还是英文字符,都被看做是一个字符。

    如果将其转换为byte数组,而后返回byte数组的长度,得到的结果将为:9。因为在GBK编码中,中文占2个字节,而英文字符占1个字节。

    执行如下代码,将得到如下图所示的输出:

[java]   
 
  1. public class Hel {  
  2.     public static void main(String[] args){  
  3.         String str = "你好hello";  
  4.             int byte_len = str.getBytes().length;  
  5.             int len = str.length();  
  6.             System.out.println("字节长度为:" + byte_len);  
  7.         System.out.println("字符长度为:" + len);  
  8.         System.out.println("系统默认编码方式:" + System.getProperty("file.encoding"));  
  9.        }  
  10. }  
   
  输出结果如下图:

    

   2、将编码方式为改为utf-8,即执行如下代码:

[java]   
 
  1. public class Hel {  
  2.     public static void main(String[] args)throws Exception{  
  3.         String str = "你好hello";  
  4.             int byte_len = str.getBytes("utf-8").length;  
  5.             int len = str.length();  
  6.             System.out.println("字节长度为:" + byte_len);  
  7.         System.out.println("字符长度为:" + len);  
  8.         System.out.println("系统默认编码方式:" + System.getProperty("file.encoding"));  
  9.        }  
  10. }  

    对于字符串 “你好hello”,得到的输出结果如下:

   

     此时得到的的byte数组的长度为:11。因为在utf-8编码中,该中文字符占了3个字节,英文字符占1个字节。

    

    3、如果将编码方式改为:utf-16,输出结果如下:

    

      此时得到的的byte数组的长度为:16。因为在utf-16编码中,该中文字符占了3个字节,英文字符占2个字节。

     3、如果将编码方式改为:utf-32,输出结果如下:

     
     此时得到的的byte数组的长度为:28。因为在utf-32编码中,所有的字符均占4个字节。
你可能感兴趣的文章
树莓派搭建可公网访问的服务器
查看>>
python使用win32*模块模拟人工操作——城通网盘下载器(一)
查看>>
python append 与浅拷贝
查看>>
一行代码搞定矩阵旋转——python
查看>>
Matlab与CUDA C的混合编程配置出现的问题及解决方案
查看>>
2017阿里内推笔试题--算法工程师(运筹优化)
查看>>
python自动化工具之pywinauto(零)
查看>>
python自动化工具之pywinauto(二)
查看>>
python自动化工具之pywinauto(三)
查看>>
python自动化工具之pywinauto(四)——批量转换exe视频
查看>>
python一句话之利用文件对话框获取文件路径
查看>>
PaperDownloader——文献命名6起来
查看>>
PaperDownloader 1.5.1——更加人性化的文献下载命名解决方案
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
系统架构:Web应用架构的新趋势---前端和后端分离的一点想法
查看>>
JVM最简生存指南
查看>>
漂亮的代码,糟糕的行为——解决Java运行时的内存问题
查看>>
Java的对象驻留
查看>>
自己动手写GC
查看>>