最近做通信部分,在发送中文的时候遇到了乱码问题。纠结了很久终于找到了答案解决的问题。
乱码往往是字符集不统一造成的,而笔者的程序中却是另一种情况引起的。message += (char)ins.read();
就是因为这句代码。。。
原因是这样的:
用char强制转型时,只能转换0—127之间的ASCII码,而我们的中文(
在GBK/GB2312字符集中中文由两个字节表示,而这连个字节不再0-127范围之内)的字节经char强制转型出来的就是“?”了。
对此我的解决方案是把每个对到的字节都放入字节队列中,在转成数组,最后用String(bytes[])转成字符串。代码如下
read = bufferedInputStream.read();
byte byte1 = (byte)read;
bytes.add(byte1);
messageRead = new String(listToBytes(bytes));
代码中的bytes是字节队列,listToBytes是队列转成数组的方法。
下面我说一下上面提及通常的原因。
首先,我先介绍一下几种java中的常用的字符集:GBK,GB2312,ASCII,ISO-8859-1,UTF-8。。
要保证不乱码,我们首先要掌握不同字符在他们的字符集中占的字节个数。
GBK:英文占1字节,中文占2字节
GB2312:同GBK
ASCII:总长7bit。。一共包括0-127的字符。。占1字节。无法表示中文。
ISO-8859-1:总长8bit。。是ASCII的扩展。。占1字节
UTF-8:英文占1字节。中文占3字节。
代码实例:
public static void compareCharset() {
byte[] bytes1, bytes2, bytes3, bytes4, bytes5, bytes6, bytes7;
String string = "a马";
try {
bytes1 = string.getBytes("GBK");
System.out.println("以GBK编码程字节长度为" + bytes1.length);
for (int i = 0; i < bytes1.length; i++) {
System.out.println("以GBK编码每个字节是" + bytes1[i]);
}
bytes2 = string.getBytes("GB2312");
System.out.println("以GB2312编码程字节长度为" + bytes2.length);
for (int i = 0; i < bytes2.length; i++) {
System.out.println("以GB2312编码每个字节是" + bytes2[i]);
}
bytes3 = string.getBytes("ISO-8859-1");
System.out.println("以ISO-8859-1编码程字节长度为" + bytes3.length);
for (int i = 0; i < bytes3.length; i++) {
System.out.println("以ISO-8859-1编码每个字节是" + bytes3[i]);
}
bytes4 = string.getBytes("ASCII");
System.out.println("以ASCII编码程字节长度为" + bytes4.length);
for (int i = 0; i < bytes4.length; i++) {
System.out.println("以ASCII编码每个字节是" + bytes4[i]);
}
bytes5 = string.getBytes("UTF-8");
System.out.println("以UTF-8编码程字节长度为" + bytes5.length);
for (int i = 0; i < bytes5.length; i++) {
System.out.println("以UTF-8编码每个字节是" + bytes5[i]);
}
bytes7 = string.getBytes("UNICODE");
System.out.println("以UNICODE编码程字节长度为" + bytes7.length);
for (int i = 0; i < bytes7.length; i++) {
System.out.println("以UNICODE编码每个字节是" + bytes7[i]);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("有不支持的字符集存在");
}
}
打印出来是:
以GBK编码程字节长度为3
以GBK编码每个字节是97
以GBK编码每个字节是-62
以GBK编码每个字节是-19
以GB2312编码程字节长度为3
以GB2312编码每个字节是97
以GB2312编码每个字节是-62
以GB2312编码每个字节是-19
以ISO-8859-1编码程字节长度为2
以ISO-8859-1编码每个字节是97
以ISO-8859-1编码每个字节是63
以ASCII编码程字节长度为2
以ASCII编码每个字节是97
以ASCII编码每个字节是63
以UTF-8编码程字节长度为4
以UTF-8编码每个字节是97
以UTF-8编码每个字节是-23
以UTF-8编码每个字节是-87
以UTF-8编码每个字节是-84
以UNICODE编码程字节长度为6
以UNICODE编码每个字节是-2
以UNICODE编码每个字节是-1
以UNICODE编码每个字节是0
以UNICODE编码每个字节是97
以UNICODE编码每个字节是-102
以UNICODE编码每个字节是108
在表示字符串的时候,我们尽量要保证字符集一致才不会乱码。。。
分享到:
相关推荐
乱码问题在IT行业中是一个常见的困扰,特别是在处理字符编码时。乱码通常发生在数据的存储、传输或显示过程中,由于编码不一致或者编码转换错误导致的。本文将探讨两种主要的解决乱码问题的策略,分别是针对MySQL...
"浅谈JAVA编写系统中文显示问题及其处理.pdf" JAVA 编写系统中文显示问题是指在使用 JAVA 语言进行系统编程时遇到的中文显示乱码问题。这些问题包括浏览器页面乱码、表单数据提交时的乱码、数据库中信息不能正确...
在本资料"浅谈为什么java命令运行class文件出现异常共7页.pdf"中,可能详细讨论了这些常见问题及其解决方法。由于提供的压缩包中仅有一个名为"赚钱项目"的文件,这似乎与Java编程无关,因此可能不是解决上述问题的...
在进行Tomcat服务器的配置和维护时,乱码问题和端口占用问题是用户经常遇到的两个典型难题。下面我将详细解析这两个问题的产生原因以及相应的解决方案。 首先,关于Tomcat乱码的问题,这通常发生在Tomcat服务器启动...
MySQL的中文乱码问题是一个常见的困扰开发者的问题,尤其是在进行数据导入、导出或者通过不同的工具与MySQL交互时。本文将详细解析这个问题,并提供相应的解决策略。 首先,问题出现在使用Eclipse通过JDBC向MySQL...
Unicode java乱码 UTF-8
Java Web 学习之 Request 对象中 GET 和 ...POST 方法的优点是可以传输大量数据,但是缺点是可能会出现乱码。同时,我们应该注意到 servlet 作为控制器是不应该输出内容的,我们应该把要打印的内容放到 JSP 文件中。
乱码问题通常与页面的编码格式有关,因此解决乱码问题的关键在于正确设置和统一页面编码。 JSP页面引入HTML文件时,虽然JSP页面的内容可以正确显示,但引入的HTML文件中可能出现乱码。为了解决这一问题,需要在HTML...
同时,了解Java IO流中的编码和解码机制,可以帮助我们更有效地处理文本数据的读写操作,避免出现编码问题。总之,掌握字节和字符的概念以及它们在Java中的应用,是每个Java开发者必备的基础知识。
经常的进行知识难点的查询,如果一个问题牵扯的面比较广,就干脆到网上搜索一些相关的专题,比如“java 乱码 mysql” “oracle 创建用户”等等,如果有必要,不要犯懒,勤动手写一些小小的测试程序,来弄明白知识点...
"浅谈Android Studio导出javadoc文档操作及问题的解决" Android Studio是当前Android应用开发的主流IDE之一,但是在实际开发中,我们经常需要生成javadoc文档以便于其他开发者或团队成员了解我们的代码结构和设计...
本文将详细探讨doctype声明的作用以及如何设置HTML文档的字符编码,以及在处理中文乱码问题时应采取的解决方案。 ### Doctype声明的作用 DOCTYPE(文档类型声明)是HTML文档的第一行代码,它的作用是告知浏览器...
此外,值得注意的是,由于MySQL的表可能采用UTF-8编码,而Excel可能默认使用GBK编码,为了避免导出的Excel文件打开时出现乱码,需要在`INTO OUTFILE`语句中指定字符集为GBK。这确保了数据导出后能正确显示。 补充一...
在需要高保密性的领域中,如电子商务系统和金融系统,Java语言需要面对“乱码”这一主要问题。 最后,汇编语言是控制计算机硬件最直接的编程语言,它具有强大的功能性,能够直接控制硬件设备。汇编语言的代码编译和...
浅谈Java中Mysql数据库的连接与操作[J]. 信息记录材料, 2020, 21(02): 144-145. [4] 郑智方, 魏恺乐, 李彬, 谢易壮. MySQL得到广泛使用的原因及其嵌入式应用[J]. 科技风, 2020(05): 114. [5] 赵秀芹, 刘杨青, 李...
然而,无线网络的安全性问题也随之凸显,容易遭到未经授权的用户蹭网。本文将探讨如何通过设置中文SSID来增强无线网络的安全性,以及如何在不支持中文SSID的设备上实现这一设置。 SSID,全称为Service Set ...
当你尝试在MySQL中存储表情时,由于utf8编码的限制,它们通常会被错误地转换为四个字节的乱码,导致数据丢失。 为了解决这个问题,MySQL引入了一个新的字符集——utf8mb4。"mb4"代表“四字节多字节”,这个编码能够...