最近做通信部分,在发送中文的时候遇到了乱码问题。纠结了很久终于找到了答案解决的问题。
乱码往往是字符集不统一造成的,而笔者的程序中却是另一种情况引起的。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
在表示字符串的时候,我们尽量要保证字符集一致才不会乱码。。。
分享到:
相关推荐
JAVA 乱码问题,JAVA 乱码问题,JAVA 乱码问题JAVA 乱码问题JAVA 乱码问题JAVA 乱码问题
java中文乱码问题详解--- java中文乱码问题详
在Java编程中,经常会碰到汉字的处理及显示问题,以不小心就会产生一大堆乱码或者问号。造成这种问题的根本原因是Java中默认的编码方式是Unicode,而中国人通常使用的文件和DB都是基于GB2312或BIG5等编码,故会出现...
浅谈乱码问题的解决方案
Java开发乱码问题解决方法: 以下是个人知道的方法汇总
java 获取乱码问题 修改server.xml 即可 下面文档具体位置介绍
java中文乱码问题java中文乱码问题java中文乱码问题
Java乱码问题解决方法,java乱码怎么解决,java项目乱码,java乱码处理,
Java关于中文乱码问题的多种解决方法,中文乱码过滤器
utf8解决JSP中文乱码问题 Tomcat 5.5中文乱码 JDBC ODBC Bridge的Bug及其解决方法 Solaris下Servlet编程的中文问题及解决办法
解决java web开发中遇到的前后台传值乱码问题。
主要为大家分享了介绍了java中文乱码之解决URL中文乱码问题的方法,感兴趣的小伙伴们可以参考一下
java解决中文乱码问题
Java乱码学习 免费下载 欢迎分享 Java乱码学习 免费下载 欢迎分享
网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...
JAVA常见中文乱码问题解决方法,JAVA常见中文乱码问题解决方法.
java编程中乱码问题解决方案,解决一些常见的java开发环境中的乱码问题
java乱码解决方案,在使用eclipse时出现的乱码问题,帮助解决
java 中出现的乱码问题,包括jsp乱码,数据传输乱码等
java项目乱码问题的处理方法,非常详细的