打字猴:1.70044293e+09
1700442930
1700442931 读取操作系统的编码格式(GBK),然后重新编码变量b的所有字节。问题就在这里产生了:因为UNICODE的存储格式是两个字节表示一个字符(注意这里是指UCS-2标准),虽然GBK也是2个字节表示一个字符,但两者之间没有影射关系,要想做转换只能读取映射表,不能实现自动转换—于是JVM就按照默认的编码格式(GBK)读取了UNICODE的两个字节。
1700442932
1700442933 步骤7 输出乱码,程序运行结束。
1700442934
1700442935 问题清楚了,解决方案也随之产生,方案有两个。
1700442936
1700442937 步骤8 修改代码。
1700442938
1700442939 明确指定编码即可,代码如下:
1700442940
1700442941 System.out.println(new String(b,“UTF-8”));
1700442942
1700442943 步骤9 修改操作系统的编码方式。
1700442944
1700442945 各个操作系统的修改方式不同,不再赘述。
1700442946
1700442947 我们可以把从字符串读取字节的过程看作是数据传输的需要(比如网络、存储),而重组字符串则是业务逻辑的需求,这样就可使乱码现场重现:通过JDBC读取的字节数组是GBK的,而业务逻辑编码时采用的是UTF-8,于是乱码产生了。对于此类问题,最好的解决办法就是使用统一的编码格式,要么都用GBK;要么都用UTF-8,各个组件、接口、逻辑层都用UTF-8,拒绝独树一帜的情况。
1700442948
1700442949 问题解释清楚了,我们再来看以下代码:
1700442950
1700442951 public class Client{
1700442952
1700442953 public static void main(String[]args)throws Exception{
1700442954
1700442955 String str=“汉字”;
1700442956
1700442957 //读取字节
1700442958
1700442959 byte[]b=str.getBytes(“GB2312”);
1700442960
1700442961 //重新生成一个新的字符串
1700442962
1700442963 System.out.println(new String(b));
1700442964
1700442965 }
1700442966
1700442967 }
1700442968
1700442969 仅仅修改了读取字节的编码格式(修改成了GB2312格式的),结果会是怎样的呢?又或者将其修改成GB18030,结果又是怎样的呢?结果都是“汉字”,不是乱码。哈哈,这是因为GB2312是中文字符集的V1.0版,GBK是V2.0版本,GB18030是V3.0版,版本是向下兼容的,只是它们包含的汉字数量不同而已,注意,UNICODE可不在这个序列之内的。
1700442970
1700442971 注意 一个系统使用统一的编码。
1700442972
1700442973
1700442974
1700442975
1700442976 编写高质量代码:改善Java程序的151个建议 [:1700438129]
1700442977 编写高质量代码:改善Java程序的151个建议 建议59:对字符串排序持一种宽容的心态
1700442978
1700442979 在Java中一涉及中文处理就会冒出很多问题来,其中排序也是一个让人头疼的课题,我们来看下面的代码:
[ 上一页 ]  [ :1.70044293e+09 ]  [ 下一页 ]