在java中读取字符串时,不可避免的遇到处理汉字的问题,而汉字乱码也是我们最常遇到的问题。
一、首先,我们先分析下java中字符串的存储规则。
与其它语言一样,java中的String实际上是一个char数组,在java中,一个char占16位也就是2个字节。所以可以表示0-65535种不同数据。
在java中,字符的显示是通过一个叫字符集的东西的,简单来说,就是一个序列(可能是一个,也可能是多个)的字节惟一地对应某个特定的符号(如汉字等)。
例如:GBK字符集中,两个相临字节:184 181表示人。97字节表示字符a;而在UTF-8编码中,156 198 198三个相临字节表示人字。一个字节97即表示a;
在java中,我们默认使用的字符集是GBK,当然,你也可以通过自己动手来改变使用的字符集,方法有以下三种:(以改变成"x-MacThai"字符集为例)
(1).Properties pps=System. getProperties();
pps.put("file.encoding","x-MacThai");
//设置完成后要将属性保存
System.setProperties(pps);
(2).System.setProperty("file.encoding","x-MacThai");
(3).运行时设置 java -D file.encoding=x-MacThai
二、其次,我们来讨论下我们出现汉字乱码问题的原因。
我们先来分析下我们在传输、或者在文件读写时的操作,我们常使用的是out.write(string.getBytes())的方法来讲我们需要的字符数据行输出。在默认情况下,getBytes方法是对字符串按照GBK格式进行解析的,即:一个字符串str=”a人”那么它解析后即变为”97 184 181”。
再来看看我们读入数据的操作,如果我们使用了读取整个比特流放入一个比特数组中,再将它以GBK的格式转化为字符串的话自然没有问题,可是如果我们如果使用了每读到一个字节就将它转化为一个字符加入字符串的话那么将必然会出问题,就以上面的str=”a人”为例,它输出的比特流为:97 184 181 而当你读到97时将它转为字符’a’后加到字符串中,这当然没问题,可是再往后看,读到184,程序还是会直接将它转为对应的字符,那么自然,问题就出来了,它只能对应出”?”,同样,字符181也只能对应出”?”,因而读到的字符串就变为也”a??”,这自然不是我们想要的结果。
三、最后,让我们讨论来如何解决问题吧,自然可以看出,是由于我们在读取数据字符流时转换到字符时出了问题,就是在转换汉字时,本应是由两个字符转成一个汉字的我们却对这两个字符分别做了处理。
下面我们来写一个算法来实现这个问题的解决吧!(以GBK为例)
(1)输出流部分:
str=”a人”
在这里,我们只需要将数据流按一定的字符集输出即可。
out.write(str.getBytes(“GBK”));
注:java中默认的是GBK字符集,所以这里不写也没关系。
(2)读取数据部分:
查询GBK字符集的规则可知道,为了区分汉字与英文字符,GBK中若读到的一个字节为<128,那么它表示一个英文字符或是符号,反之则为一个汉字。 知道规则后,我们便很好来设计算法了。
1> 读取一个字节数据。
2> 若它小于128,则直接将其以GBK字符集转为字符,加入到输出字符串中。 转第一步。
3> 若它大于等于128再读取一个字节数据,将它们一起以GBK字符集转为字符,加入到输出字符串中。转第一步。
四、小结:关于汉字,有许多的字符集可供使用,这里给大家一个链接供大家参考。
http://baike.baidu.com/view/51987.htm
分享到:
相关推荐
java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...
用java查找汉字字符串有多重算法,其中Boyer-Moore是基本算法之一。算法简洁,开发容易,是进行搜索引擎开发的重要算法之一。
字符串相似度算法 字符串相似度算法 字符串相似度算法 字符串相似度算法 相似度 字符串
java字符串处理取出括号内的字符串 都是我自己试过可以用的j
java代码-使用java解决xml--查找并替换字符串(避免乱码)的问题的源代码 ——学习参考资料:仅用于个人学习使用!
运行程序之后输入任意的字符串,将字符串转化成二进制数字字符串,然后利用LZ78算法实现对二进制字符串压缩解压,最后再恢复原来的字符串
JAVA字符串处理函数列表一览 JAVA字符串相关
Java 实现推荐系统 两个字符串 余弦相似度 算法。
java 字符串 详细实例代码 字符串检索 可改变字符串 字符串生成器 日期和时间字符串格式化
java 常用字符串处理工具类! java 常用字符串处理工具类!
对网上问的一些问题的总结,封装成了一个工具类。完成的功能有: 1、判断字符串中是否有中文; 2、得到字符串中有几个中文; 3、判断字符串中有没有连续的几个中文;
JAVA字符串处理函数列表一览.txtJAVA字符串处理函数列表一览.txt
本文通过实例代码给大家介绍了Java判断字符串是否含有乱码的方法,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
Java字符串查找和提取异常处理,最有效的方法
java压缩字符串
JAVA可逆带秘钥字符串加密算法,JAVA可逆带秘钥字符串加密算法
JAVA的字符串拼接与性能 概述:本文主要研究的是JAVA的字符串拼接的性能,原文中的测试代码在功能上并不等价,导致concat的测试意义不大。不过原作者在评论栏给了新的concat结果,如果有兴趣的同学建议自己修改代码...
java 字符串的加密 java 字符串的加密 java 字符串的加密
java字符串处理的util工具类,也可以同时添加一些其他字符处理的方法,对于项目中特殊字符处理,完成项目中基本的字串符处理。
89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符...