在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代码生成汉字库是一个涉及到字符编码、汉字处理和随机生成技术的编程任务。在这个项目中,开发者使用Java语言创建了一个程序,能够按照GB2312、GBK、Unicode和UTF-8这四种常见的汉字编码标准生成汉字库。下面将...
在Java编程语言中,处理中文字符串时,理解字符与字节之间的转换是非常关键的。本文将深入探讨如何将中文字符串转换成UTF-8编码的字节数组,并解析这一过程中的计算步骤。UTF-8是一种广泛使用的Unicode字符编码,它...
在处理中文乱码问题上,我们可以编写C/C++本地库,对输入的中文字符串进行加密,然后在Java中调用这个库进行解密。这样,即使中间环节出现编码问题,最终解密后的中文字符串也能正确恢复。 具体步骤如下: 1. **...
在进行字符串到字节数组的转换时,应确保使用正确的字符编码,以避免中文等多字节字符在转换过程中出现乱码。通常,"UTF-8"编码是个不错的选择,因为它支持广泛的字符集。 此外,虽然GZIP压缩能够节省存储空间,但...
在Java中,将字符串转换为16进制表示是一个常见的需求,尤其是在处理网络通信、加密解密等场景。 **示例代码:** ```java public static String Bytes2HexString(byte[] b) { String ret = ""; for (int i = 0; i...
在本篇文章中,我们将详细探讨如何在Vue项目中应用这一库来处理gzip加密的字符串。 首先,需要明白gzip是一种广泛使用的数据压缩算法,它会将数据进行压缩处理以减小数据的大小,通常用于网络传输和存储以提高效率...
`Encoder`类负责加密过程,`Decoder`类负责解密,而`Utils`类可以提供一些辅助函数,如将字符串转换为字节数组,以及处理其他与二进制数据相关的操作。 `Encoder`类的核心是异或操作。它会接收明文字符串和密钥,...
- 提供编码转换函数,如`UTF_8ToGBK(String str)`,用于在不同编码之间转换字符串。 #### 四、案例分析 以部分示例代码为例,如Java中使用`String s1 = new String(s.getBytes("ISO-8859-1"), "GBK");`来进行编码...
在IT行业中,数据压缩是一种常见的优化技术,用于减少文件大小,提高传输效率和存储空间利用率。pako是一个高效的JavaScript库,提供了对多种压缩算法的支持,包括gzip。在本项目中,我们将关注如何使用pako库进行...
如果直接对中文字符串进行加密,可能会导致乱码。正确做法是先将中文字符串转换为UTF-8字节序列,再进行加密,解密后回转为原始的字符串。 对于长字符串,`DES`的64位数据块限制意味着长字符串需要被拆分成多个64位...
这可能是一个用于将中文字符转换为16进制表示的工具,16进制表示常用于在网络传输或者存储中处理中文字符,避免乱码问题。在Java中,可以使用`Character`类的`forDigit()`和`toString()`方法,以及`Integer....
本资源提供的是一个用Java语言编写的AES加密工具,特别针对中文乱码问题进行了优化,且支持不同长度的加密秘钥。 首先,让我们深入了解一下AES加密。AES采用块密码模式,每个数据块大小为128位,可以使用128、192或...
后端服务应确保将正确编码的字符串返回给前端,前端也需要正确解析这些数据。 "studydemo"可能包含了处理汉字传输的示例,比如在服务器端将汉字转换为特定编码,然后通过HTTP响应发送,客户端接收到数据后再解码成...
至于标签的换行不被识别,这可能是因为XML中的换行字符没有被正确处理,或者mxGraph的默认配置不支持多行文本。可以尝试在XML中使用特殊的换行符号(例如,使用` `标签),并在解析时确保它们被正确解析和渲染。 ...
实例38 Java字符串与文件的互转 88 实例39 截取带汉字的字符串 91 实例40 替换字符串中的部分字符 92 实例41 Java字符串之密码加密 93 实例42 正则表达式验证字符串 95 第7章 Java常用类 98 实例43 数字的舍入...
解码过程则相反,接收Base64编码的字符串后,将每4个字符(32位)转换回3个字节的数据,如果末尾有填充的字符,会忽略掉相应的位。 在提到的"目前速度最快、效率最高",可能是指这个Base64工具采用了优化的算法,...
本压缩包文件提供了两个工具类,用于对GBK格式的字符串进行URL编码。这两个工具类可能分别采用了不同的编码策略,例如一个可能使用了Java的`java.net.URLEncoder`类并指定GBK为字符集,另一个可能实现了自定义的编码...
GB2312、GBK、BIG5主要用于中文,GBK是对GB2312的扩展,增加了更多的汉字;UTF-8是一种可变长度的Unicode编码,广泛用于互联网,支持全球大部分语言;UTF-16则每个字符通常占用2个或4个字节。 2. **编码检测的必要...
如何处理中文乱码问题 中文乱码问题是开发过程中常见的问题之一,尤其是在涉及到中文字符输入输出的情况下。以下是一些解决中文乱码的方法: - **设置字符编码**:在连接数据库时指定字符编码,例如`?useUnicode=...
- 利用`std::string`类型存储字符串。 - 使用`iconv`库进行编码转换。 - **Java实现**: - `String`类支持多种编码。 - `InputStreamReader`和`OutputStreamWriter`可用于编码转换。 **几个乱码产生的原因和解决...