一、前言

在分析Comparable和Comparator的时候,分析到了String类的compareTo方法,String底层是用char[]数组来存放元素,在比较的时候是比较的两个字符串的字符,字符用char来存储,此时,突然想到,Java里面的char可以存放中文吗?后来发现是可以的,并且由此也引出了Java中字符的编码格式问题。

二、Java存储格式

在Java中,如下代码获取了字符'张'的各种编码格式。

import java.io.UnsupportedEncodingException;

public class Test {

public static String getCode(String content,String format) throws UnsupportedEncodingException {

byte[] bytes = content.getBytes(format);

StringBuffer sb = new StringBuffer();

for (int i = 0; i < bytes.length; i++) {

sb.append(Integer.toHexString(bytes[i] & 0xff).toUpperCase() + " ");

}

return sb.toString();

}

public static void main(String[] args) throws UnsupportedEncodingException {

System.out.println("gbk : " + getCode("张","gbk"));

System.out.println("gb2312 : " + getCode("张","gb2312"));

System.out.println("iso-8859-1 : " + getCode("张","iso-8859-1"));

System.out.println("unicode : " + getCode("张","unicode"));

System.out.println("utf-16 : " + getCode("张","utf-16"));

System.out.println("utf-8 : " + getCode("张","utf-8"));

}

}

运行结果:

gbk : D5 C5

gb2312 : D5 C5

iso-8859-1 : 3F

unicode : FE FF 5F 20

utf-16 : FE FF 5F 20

utf-8 : E5 BC A0

说明:从结果我们可以知道,字符'张'的gbk与gb2312编码是相同的,unicode与utf-16编码时相同的,但是其iso-8859-1、unicode、utf-8编码都是不相同的。那么,在JVM中,字符'张'是按照哪种编码格式进行存储的呢?下面开始我们的分析。

三、探秘思路

1. 查看.class文件常量池的存储格式

测试代码如下

public class Test {

public static void main(String[] args) {

String str = "张";

}

}

使用javap -verbose Test.class进行反编译,发现常量池情况如下:

再使用winhex打开class文件,发现字符'张'在常量池的存储如下

说明:上面两张可以在class文件中是以utf-8的格式存储的。

但是在运行时是否是utf-8格式呢?继续我们的探秘之旅。

2. 在程序中一探究竟

使用如下代码

public class Test {

public static void main(String[] args) {

String str = "张";

System.out.println(Integer.toHexString(str.codePointAt(0)).toUpperCase());

}

}

运行结果:

5F20

说明:根据结果我们知道在运行时JVM是使用的utf-16格式进行存储,utf-16一般是使用2个字节进行存储,如果遇到两个字节无法表示的字符则会使用4个字节表示。之后会另外有篇幅进行介绍,并且我们查看Character类源码时,会发现就是使用的utf-16进行编码的,从两面都找到了我们想要的答案。

3. char类型可以存放中文吗?

根据上面的探索我们已经知道了Java的class文件中字符是以utf-8进行编码的,在JVM运行时则是以utf-16进行编码存储的。而字符'张'可以用两个字节来表示,而char在Java中也是两个字节,故可以存放。

四、总结

经过上面的分析,我们知道:

1. 字符在class文件中是以utf-8格式进行编码的,而在JVM运行时是采用utf-16格式进行编码的。

2. char类型是两个字节,可以用来存放中文。

在此次调用的过程中又查阅了好多关于字符方面的资料,受益匪浅,并且发现特别有意思,接下来会进行分享,所以特此预告下一篇将会进一步来介绍编码以及编码在Java中的问题。敬请期待

总结

以上是编程之家为你收集整理的Java中字符编码格式详解全部内容,希望文章能够帮你解决Java中字符编码格式详解所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

java字符编码详解_Java中字符编码格式详解相关推荐

  1. Java中static的作用详解_java中static作用详解

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  2. java collection详解_Java中的Collection详解

    在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是Java API提供了多种集合的实现. 总的说来,Java API中所用的集合类,都是实现了Collection接口,他的 ...

  3. 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案

    基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...

  4. java错误: 编码 GBK 的不可映射字符 (0x9C)

    java错误: 编码 GBK 的不可映射字符 (0x9C) 目录 java错误: 编码 GBK 的不可映射字符 (0x9C) 错误情况示例: 解决办法: 错误情况示例: E:\myJavaCode&g ...

  5. python 字符编码处理_浅析Python 字符编码与文件处理

    Python字符编码 目前计算机内存的字符编码都是Unicode,目前国内的windows操作系统采用的是gbk. python2默认的字符编码方式是ASCII python3默认的字符编码方式是Un ...

  6. python字符编码用什么储存卡_python字符编码

    一 了解字符编码的知识储备 一 计算机基础知识 二 文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的 ...

  7. java 字节编码_java中字符与字节的编码关系

    一个英文字母字符存储需要1个字节.在 GB 2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节. 在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节.在 ...

  8. java 自定义正则表达式_java中正则表达式实例详解

    Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * ...

  9. java 字符 几个字节_java中字符串占几个字节

    首先,char为Java的基本类型,基本类型所占的字节数是固定的,如int占4字节,double占8字节,这可以使得Java在不同的平台上所占类型固定,很好地保证了Java的可移植性.因此,Java中 ...

最新文章

  1. Activt工作流数据库对应表的作用
  2. 35.页面置换算法有哪些?
  3. SAP外向交货单中的批次拆分应用于免费货物的小问题
  4. tf.contrib.slim arg_scope
  5. Java : ServiceLoader详解
  6. Python 装饰器实例
  7. java基础知识精讲视频教程百度云盘分享!
  8. 360浏览器各历史版本大全和bug汇总(及历史版本官方下载地址)
  9. 酒浓码浓 - HTML5微数据/itemscope/itemtype/itemprop
  10. 转置矩阵,逆矩阵和倒转置矩阵
  11. Spring Cloud简单笔记
  12. PTA - 数据库合集27
  13. 小程序基础开发(三):授权,获取用户信息,注册,登录,简单封装request请求
  14. Django3创建数据库表模型及 Django 管理页面
  15. 汽车电气化共享移动性及自动驾驶对未来出行方式的全面展望
  16. AS打开照相机拍照保存本地、显示页面
  17. mac mini安装ubuntu系统
  18. 安卓背景音乐开关_微信这个功能你知道了么?打开这个开关,能把手机照片拼接成长图...
  19. 1、OmniGraffle系列-思维导图
  20. 实战:Flink1.12异步IO访问外部数据-Mysql

热门文章

  1. Hadoop3.2.0使用详解
  2. Storm目录树和任务提交过程
  3. php.ini路径设置、libmysql.dll加载等
  4. 服务器支持http tcp,Nginx配置http和tcp(示例代码)
  5. 收集linux系统日志的命令,整理Linux查看系统日志的一些经常使用命令
  6. java怎么把弹框设置为圆角_自定义圆角Dialog
  7. mysql update textl类型_MySQL 字段类型参考
  8. 【测试用例】2021年逢面试必考题
  9. linux 清空进程recv q,Linux中ss命令Recv-Q和Send-Q详解
  10. k1658停运到什么时候_2021年春运就要开始啦!快来看看各大快递的停运时间吧