java字符串编码问题在遇到乱码情况下也看过一些原理,但是没有仔细研究过,最近项目中用到socket接收字节数组转换字符串,所以算是仔细地研究了下,不太深入,根据例子所总结。
一、String类有很多构造方法,最近常用到的有两种,String(byte[] bytes)和
String(byte[] bytes,
String charsetName)。第一个是根据byte数组按照系统默认的编码方式生成字符串;第二个是根据byte数组按照指定编码方式生成字符串。
例子中byte数组是字符串“@中文”的gbk编码数组(可以根据gbk编码对照表查看),我本机是win7操作系统,系统默认gbk编码。
1)按系统默认编码方式:
public static void main(String[] args) {
byte[] b = new byte[] { 64, (byte) 0xD6, (byte) 0xD0, (byte) 0xCE,(byte) 0xC4 };
System.out.println(new String(b));
}
运行结果:@中文
2)按照指定编码格式方式:
public static void main(String[] args) {
byte[] b = new byte[] { 64, (byte) 0xD6, (byte) 0xD0, (byte) 0xCE,(byte) 0xC4 };
try {
System.out.println(new String(b,"utf-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行结果:@????
总结:
由于我的byte数组定义时为gbk编码量身打造,所以1)中输出正确。2)中utf-8编码只能识别数组中的第1位‘@’字符,另外几个数组识别不了,所以每个字节解释为‘?’。
看似很简单的demo,其实从生成字符串到打印到控制台经历了几个步骤。如下:
byte[]--->根据编码方式生成String--->String在jvm中保存为unicode编码格式--->System.out.println()按照系统默认编码把字符串打印到控制台--->控制台按照指定编码(默认系统编码)查看字符串。
根据此步骤分析1):
b--->"@中文"--->6位字节的unicode编码格式byte数组(jvm)--->5位gbk编码格式byte数组--->控制台以gbk格式查看会看到"@中文"
其中示例2)中在步骤2时已经得到乱码字符串"@????",所以会在控制台看到乱码。
二、String类中有两个获取字节数组的方法,getBytes()和
getBytes(String charsetName),第一个是获取字符串系统默认编码方式的byte数组。第二个则是获取字符串指定编码方式格式的byte数组。
1)根据系统默认方式获取
public static void main(String[] args){
String s = "@中文";
System.out.println(s.getBytes().length);
}
运行结果:5
2)根据指定(utf-8)编码方式获取:
public static void main(String[] args){
String s = "@中文";
try {
System.out.println(s.getBytes("utf-8").length);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行结果:7
总结:示例1)根据gbk编码获取,gbk编码中文两个字节,因此长度为5.
示例2)根据utf-8编码获取,utf-8编码中文三个字节,因此长度为7.
有兴趣可以把不同编码方式得到的字节数组中每个字节的int类型打印出来,跟编码表比对一下。
java乱码问题涉及到很多方面,这里只是分析String最基础的部分,其他的会在有时间时再研究。
附件中包含了gbk、unicode和asc编码表格。有兴趣可以看下。
分享到:
相关推荐
Java中编码总结.pdf
1.整型实例。 修复建议:使用Integer.valueOf()替代new Integer。 2.switch语句包含太少分支。 修复建议:分支比较少的时候建议使用if else。原因:switch用来处理多分支的情况。 3.Switch语句应该包含一个...
Java编码规范 java编码的经验总结
此文档为Java中编码方式和Unicode知识总结,对了解学习Java编码的讲解很全面清楚!
JAVA编码问题的总结,详细解析JAVA编码机制和各种相关问题
Java中编码总结[整理].pdf
每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte)。 也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 ...
ava支持UTF 8 ISO 8859 1 GBK等各种字体编码 可笔者发现Java中字体编码的问题仍难倒了不少程序员 网上虽然也有不少关于在Java中如何正确显示中文的文章 但都不够全面 笔者特意总结如下 影响Java中字体编码正确显示...
Java中编码以及Unicode总结
自己总结的有关java 编码方式的知识
1,我不要自我重复: 这也许是在编程开发这最最基本的一个信条,就是要告诉你不要出现重复的代码。我们很多的编程结构之所以存在,就是为了帮助我们消除重复(例如,循环语句,函数,类,等等)。一旦程序里开始有重复...
总结了java中常见的utf-8、gbk等进行字符串编码转换
结合实际开发经验,总结了java开发的编码规范!可以比较参考!
做项目时总结的,java程序获取文件编码方式的两种最常用的方式(1.cpdetector第三方jar包,包含源码elipse项目;2.EncodingDetect.java工具类)。
tomcat字符编码总结 深入了解!从网上搜集了很多,自己整理的
//编码解码1:默认编码 String str1 = "你好"; byte[] buf1 = str1.getBytes();//默认解码:Unicode,四个字节 //编码解码2:指定编码 String str2 = "你好"; byte[] buf2 = str2.getBytes("UTF-8");//指定...
《阿里巴巴Java开发手册》是阿里内部Java工程师所遵循的开发规范,涵盖编程规约、单元测试规约、异常日志规约、MySQL规约、工程规约、安全规约等,这是近万名阿里Java技术精英的经验总结,并经历了多次大规模一线...