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 编码规范 腾讯 Java 编码规范是腾讯集团管理标准的一部分,旨在确保公司项目代码的易维护性和编码安全性。该规范涵盖了 Java 编码风格、文件组织、代码风格、注释、命名、声明、异常、习惯等方面。 一、...
由于提供的文件内容包含了技术性质的详细说明,所以本段落将根据提供的文档内容概述Java中的编码知识,同时纠正识别错误并补充遗漏,确保知识的连贯性和准确性。 首先,文档中提到了Java中与字符编码相关的基本概念...
1.整型实例。 修复建议:使用Integer.valueOf()替代new Integer。 2.switch语句包含太少分支。 修复建议:分支比较少的时候建议使用if else。原因:switch用来处理多分支的情况。 3.Switch语句应该包含一个...
Java编码是程序开发的核心环节,主要涉及Java语言的语法、编程规范、最佳实践以及相关工具的使用。在Java编程中,我们遵循一定的规则和标准,以确保代码的可读性、可维护性和高效性。以下是对Java编码相关知识点的...
以下是对Java中编码方式和Unicode的知识点总结: 1. 基本概念 - bit:计算机存储的最小单位,只能是0或者1。 - byte:一个字节是8个bit,计算机表示的基本单位。 - 字节换算:1KB(千字节)= 1024字节,1MB(兆字节...
### Java编码格式转换 在Java开发中,字符编码的转换是一项常见的需求,尤其是在处理国际化文本时。本文将详细介绍如何在不同的编码格式之间进行转换,并探讨一些常见的编码转换错误及其处理方法。 #### Unicode与...
总结而言,该JAVA安全编码规范参考文档为开发者在编写安全的Java代码时提供了一套全面的指导方针,从基本原则到具体漏洞的解决办法,都有详细说明。遵守这些安全编码规范,能有效减少系统漏洞,提高Java应用的安全性...
本文将详细介绍如何在Java编码中创建注释以及如何使用apidoc工具自动生成文档。 首先,Java提供了多种注释类型,包括单行注释、多行注释和Javadoc注释。单行注释以`//`开始,适用于快速添加临时或简单的说明。多行...
### Java判断文件编码的方法 在Java开发中,经常会遇到需要处理不同编码格式的文件的情况。为了确保程序能够正确解析文件内容,必须先判断文件的编码格式。本文将详细介绍如何使用Java来判断文件是否为UTF-8或GBK...
总结来说,Java编码规范是实现高质量Java代码的基础,涵盖了代码格式化、命名、排版、注释等多个方面。遵循这些规范,不仅有助于提升代码的可读性和可维护性,还能促进团队内部的协作效率,确保项目开发的标准化和...
### Java字符串编码转换详解 #### 一、Java 字符串编码转换基础 在Java中,字符串的处理是非常常见的操作之一,而字符编码是确保数据正确显示的关键因素。本篇文章将重点介绍Java中字符串编码的转换方法及其在Web...
总结来说,`JAVA 转换字符编码工具`是利用Java语言实现的字符编码转换程序,通过提供的源代码文件可以学习到如何在Java中进行编码转换操作,以及如何设计和测试这样的工具。这个工具对于处理多语言环境或跨平台通信...
以上总结了Java编码中常见的错误及其解决方案。通过遵循最佳实践和避免常见的陷阱,可以显著提高代码质量和系统的安全性及性能。开发者应当持续学习最新的技术趋势和最佳实践,以提升自己的编程水平。
总结,理解并正确处理Java中的字符编码问题,需要关注整个数据流程,从数据库到Java代码再到最终的显示。开发者必须确保每个环节的编码保持一致,或进行必要的转换,才能确保中文字符的正确显示。对于Java开发人员来...
总结来说,这个Java示例展示了如何使用Hex编码和解码配合AES加密算法进行数据安全保护。在实际应用中,为了提高安全性,通常会采用更复杂的加密模式(如CBC或CFB),并使用随机生成的密钥,而不是固定或硬编码的密钥...
下面将详细介绍Java编码规范以及东软在项目规范方面的部分要点。 1. **命名规范**: - 类名:使用大驼峰式命名,每个单词首字母大写,例如`MyClassName`。 - 变量名和方法名:使用小驼峰式命名,首个单词首字母...