javastring设置编码_详解Java中String类型与默认字符编码为什么写这个
⾄于为什么要写这个,主要是⼀句mmp⼀定要讲,绕了⼀上午,晕死
Java程序中的中⽂乱码问题⼀直是⼀个困扰程序员的难题,⾃⼰也不例外,早在做项⽬时就遇到过很多编码⽅式的坑,当时想填来着,但是嫌⿇烦。这次终于忍不住了,⼀定要弄个明⽩
String类型的编码⽅式
从⽹上查的资料都说,Java默认的字符编码是Unicode,⽽String类型的编码⽅式是与JVM编码⽅式和本机操作系统默认字符集有关的。于是我做出了测试
在Java中可以这样显⽰查看本地编码⽅式(JVM还是OS呢?)
// Gets the system property indicated by the specified key.
System.out.ding));
看注释上说是获取系统字符集,但是我对这个系统的概念表⽰存疑,为什么呢,因为众所周知,我们中国⼈的电脑⼤部分默认的字符编码⽅式就是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 Bytes("GBK")));
// 2.以UTF-8编码⽅式获取str的字节数组,再以默认编码构造字符串
System.out.println(new Bytes("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类型的,⽽是使⽤byte数组来传输操作数据,⼀般会使⽤Bytes()⽅法来将字符串转换成字节数组。但是这样转换的时候,会不会牵涉到编码问题呢?仔细查看了Bytes()的源码,分为⽆参的和有参的两种:
// 1.⽆参的getBytes()⽅法
public byte[] getBytes() {
// 再继续深⼊encode()⽅法可以发现使⽤的是系统默认的字符编码
de(value, 0, value.length);
}
// 2.带参数的getBytes(String charsetName)⽅法
public byte[] getBytes(String charsetName)
throws UnsupportedEncodingException {
if (charsetName == null) throw new NullPointerException();
// 继续深⼊可以发现,会使⽤参数字符集编码⽅式来返回字节数组,如果参数字符集不存在,则使⽤本地系统默认的字符编码
de(charsetName, value, 0, value.length);
}
java语言使用的字符码集是综上,在这⾥再强调⼀下,因为修改了项⽬的编码⽅式,导致了本地系统的编码⽅式也变成了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编码⽅式相关的
因为Java代码使⽤的Unicode字符集,允许各编码⽅式之间转换,但不保证bit损失,所以String类型可以得到不同编码⽅式的byte数组,只要按照编码解码的⽅式获取字符串类型显⽰即可
⽂件的流通道是根据⽂件的编码⽅式决定的,所以不同编码⽅式的⽂件读写时要注意编码解码
ByteBuffer声明的buffer可以与byte数组之间进⾏转换,但要注意的是ByteBuffer的⼤⼩⼀定要⾜够⼤以承载下所有的byte数组
⼩总结
搞清楚了这些甚是豁然开朗,其实很多时候中⽂的乱码问题根源就是编码⽅式与解码⽅式不⼀致,或
者是不同编码⽅式之间转换时造成了bit 损失。所以我们还是要注意规范化编码与解码⽅式,毕竟有的转换操作是不可逆的。
以上所述是⼩编给⼤家介绍的Java中String类型与默认字符编码详解整合,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对脚本之家⽹站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论