为什么写这个

至于为什么要写这个,主要是一句mmp一定要讲,绕了一上午,晕死

Java程序中的中文乱码问题一直是一个困扰程序员的难题,自己也不例外,早在做项目时就遇到过很多编码方式的坑,当时想填来着,但是嫌麻烦。这次终于忍不住了,一定要弄个明白

String类型的编码方式

从网上查的资料都说,Java默认的字符编码是Unicode,而String类型的编码方式是与JVM编码方式和本机操作系统默认字符集有关的。于是我做出了测试

在Java中可以这样显示查看本地编码方式(JVM还是OS呢?)

// Gets the system property indicated by the specified key.

System.out.println(System.getProperty(file.encoding));

看注释上说是获取系统字符集,但是我对这个系统的概念表示存疑,为什么呢,因为众所周知,我们中国人的电脑大部分默认的字符编码方式就是GBK,在CMD中输入chcp可以获得一个数值936,这就表示了是GBK的编码方式。

但是我自己运行出这句话的结果竟然是UTF-8,我是在IDEA中运行的,并且已经使用IDEA设置了项目的编码方式是UTF-8,出现这样的结果我只能是猜测其实上面这句话是获取JVM(跟随项目的编码方式)的编码方式

接下来我们来回归正题,String类型的默认编码方式是什么,有下面这几句语句:

/* 测试String类型默认的编码方式

*/

// 使用String的有参构造方法

String str = new String("hhhh ty智障%shfu摸淑芬十分uif内服NSF黑");

// 1.以GBK编码方式获取str的字节数组,再用String有参构造函数构造字符串

System.out.println(new String(str.getBytes("GBK")));

// 2.以UTF-8编码方式获取str的字节数组,再以默认编码构造字符串

System.out.println(new String(str.getBytes("UTF-8")));

下面来看一下运行结果:

// 1.

hhhh ty����%shfu�����ʮ��uif�ڷ�NSF��i����ظ���u��Ϊ��ؼu ��δ���δ��� hhhh ty智障%shfu摸淑芬十分uif内服NSF黑i飞鸟回复额u发为呢丶u 房未婚夫未婚夫

// 2.

hhhh ty智障%shfu摸淑芬十分uif内服NSF黑i飞鸟回复额u发为呢丶u 房未婚夫未婚夫

可以很明显的可以看出,这里String类型默认的字符编码方式就是与我们查看本地系统的编码方式相同。因此我们得出结论:String类型的默认编码方式是和本地编码方式相关

String.getBytes()方法

我们大多数情况下是不使用String类型的,而是使用byte数组来传输操作数据,一般会使用String.getBytes()方法来将字符串转换成字节数组。但是这样转换的时候,会不会牵涉到编码问题呢?仔细查看了String.getBytes()的源码,分为无参的和有参的两种:

// 1.无参的getBytes()方法

public byte[] getBytes() {

// 再继续深入encode()方法可以发现使用的是系统默认的字符编码

return StringCoding.encode(value, 0, value.length);

}

// 2.带参数的getBytes(String charsetName)方法

public byte[] getBytes(String charsetName)

throws UnsupportedEncodingException {

if (charsetName == null) throw new NullPointerException();

// 继续深入可以发现,会使用参数字符集编码方式来返回字节数组,如果参数字符集不存在,则使用本地系统默认的字符编码

return StringCoding.encode(charsetName, value, 0, value.length);

}

综上,在这里再强调一下,因为修改了项目的编码方式,导致了本地系统的编码方式也变成了UTF-8,所以上述的实验都是基于IDE修改了工程项目编码方式的基础上

ByteBuffer与byte数组的互相转换

在NIO中,一般都是使用ByteBuffer来当作字符缓冲,而有的时候我们只有byte[]数组,所以是需要它们之间进行相互转换的

// ByteBuffer ----> byte[]

byte[] bytes = ByteBuffer.array();

// byte[] ------> ByteBuffer

byte[] bytes = new byte[1024];

ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

So

综上所述,再在这里总结一下:

本地JVM的编码方式是和本机OS默认的字符编码方式相关的,但是JVM的编码方式可以被修改

Java程序的默认字符集是Unicode,在程序中声明的String类型的编码方式是和JVM编码方式相关的

String.getBytes()方法默认的编码方式是JVM编码方式;同时还可以接收一个字符集名称当作参数,优先使用参数的字符集

因为Java代码使用的Unicode字符集,允许各编码方式之间转换,但不保证bit损失,所以String类型可以得到不同编码方式的byte数组,只要按照编码解码的方式获取字符串类型显示即可

文件的流通道是根据文件的编码方式决定的,所以不同编码方式的文件读写时要注意编码解码

ByteBuffer声明的buffer可以与byte数组之间进行转换,但要注意的是ByteBuffer的大小一定要足够大以承载下所有的byte数组

小总结

搞清楚了这些甚是豁然开朗,其实很多时候中文的乱码问题根源就是编码方式与解码方式不一致,或者是不同编码方式之间转换时造成了bit损失。所以我们还是要注意规范化编码与解码方式,毕竟有的转换操作是不可逆的。

以上所述是小编给大家介绍的Java中String类型与默认字符编码详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

java string设置编码_详解Java中String类型与默认字符编码相关推荐

  1. java 创建对象 设置属性_详解Java的对象创建

    1. 前言 在<还不清楚怎样面向对象?>和<面向对象再探究>两篇文章中,都介绍了关于面向对象程序设计的概念和特点.其中也涉及到了许多代码,比如: Dog dog = new D ...

  2. java calendar 设置时区_详解Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat

    一.概述 1.问题描述 使用Java处理时间时,我们可能会经常发现时间不对,比如相差8个小时等等,其真实原因便是TimeZone.只有正确合理的运用TimeZone,才能保证系统时间无论何时都是准确的 ...

  3. java 配置文件的路径_详解java配置文件的路径问题

    详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...

  4. python socket自动重连_详解python3中socket套接字的编码问题解决

    一.TCP 1.tcp服务器创建 #创建服务器 from socket import * from time import ctime #导入ctime HOST = '' #任意主机 PORT = ...

  5. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  6. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  7. java 线程一直运行状态_详解JAVA 线程-线程的状态有哪些?它是如何工作的?

    线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...

  8. java注解 源码_详解Java注解教程及自定义注解

    详解Java注解教程及自定义注解 更新时间:2016-02-26 11:47:06   作者:佚名   我要评论(0) Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个 ...

  9. java访问本地文件_详解Java读取本地文件并显示在JSP文件中

    详解Java读取本地文件并显示在JSP文件中 当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片.其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相 ...

最新文章

  1. 用windows自带压缩备份mysql_Windows下配合计划任务的Mysql定时压缩备份
  2. 未能找到类型或命名空间名称_命名空间详解
  3. Sigmoid是品优函数吗?
  4. HTML5调用手机前置摄像头或后置摄像头拍照,canvas显示,经过Android测试
  5. Spark笔记——技术点汇总
  6. y电容如何选型_干式试验变压器选型依据
  7. 计算机工勤考试试题,(河南省事业单位工勤技能考试试题_计算机信息处理.doc
  8. 【docker】第一节:centos安装docker
  9. DDMS连接bluestacks找不到设备
  10. Java并发编程-线程池底层工作原理
  11. PHP—使用MYSQL来登陆用户
  12. Hystrix都停更了,我为什么还要学?
  13. 【OpenCV笔记一】Mac安装OpenCV环境及demo
  14. 学习基础的html代码知识(入门篇)
  15. Scrum板与Kanban如何抉择?adpoqqrql板与按照zbocyo
  16. linux系统输入数字 求最大值,写函数,输入n个数字输出最大值和最小值
  17. springboot+Rabit实战二:(Rabbit MQ web 界面管理)
  18. KMP的个人向总结(next数组 || DFA实现--JAVAC++魔改版)--by wxj
  19. 计算机设备和打印机打不开,Windows7设备和打印机窗口打不开如何解决
  20. 网站关键词怎么布局才更合理?

热门文章

  1. springcloudalibaba项目使用情况
  2. 《Spring源码深度解析 郝佳 第2版》SpringBoot体系分析、Starter的原理
  3. R在作图时遇到的问题以及解决方法
  4. 路由器登陆wlan网络连接服务器无响应,无线路由器服务器无响应
  5. Aruba无线网络学习(二)
  6. html怎么创建邮件连接,html如何创建电子邮件链接
  7. 2018中国行政区划数据(省,市.县(区))
  8. 关于淘宝、天猫、阿里巴巴/1688商品详情api接口
  9. 自考 计算机网络实践报告,2021年度自考计算机与网络技术基础实践报告.doc
  10. java seqlist_来吧java,创建一个SeqList类