浅谈java乱码问题

最近做通信部分,在发送中文的时候遇到了乱码问题。纠结了很久终于找到了答案解决的问题。

[b]乱码往往是字符集不统一造成的,而笔者的程序中却是另一种情况引起的。[/b]message += (char)ins.read();
就是因为这句代码。。。
原因是这样的:[b][color=red]用char强制转型时,只能转换0—127之间的ASCII码[/color][/b],而我们的中文([color=red]在GBK/GB2312字符集中中文由两个字节表示,而这连个字节不再0-127范围之内[/color])的字节经char强制转型出来的就是“?”了。
对此我的解决方案是把每个对到的字节都放入字节队列中,在转成数组,最后用String(bytes[])转成字符串。代码如下

read = bufferedInputStream.read();
byte byte1 = (byte)read;
bytes.add(byte1);
messageRead = new String(listToBytes(bytes));


代码中的bytes是字节队列,listToBytes是队列转成数组的方法。

[b]下面我说一下上面提及通常的原因。[/b]
首先,我先介绍一下几种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

在表示字符串的时候,我们尽量要保证字符集一致才不会乱码。。。
标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值