编码问题

来源:互联网 发布:王菲 蔡依林 知乎 编辑:程序博客网 时间:2024/06/01 10:49

编码
 字符-->字节数组

 解码
 字节数组-->字符

//编码
String str = "你好";
byte[] bus = str.getBytes("UTF-8");


//解码
String str1 = new String(bus,"UTF-8");
System.out.println(str1);


//如果用错码表
String str2 = new String(bus,"iso8859-1");
byte[] bus1 = str2.getBytes("iso8859-1");//获取源码 如果这里是UTF-8会不成功,因为UTF-8解码时会改变源码,如果解不出来会被17 -65 -67代替,而不是?
String str3 = new String(bus1,"UTF-8");
System.out.println(str3);


//"联通问题" 联通的GBK编码与UTF-8的编码冲突,记事本默认用了UTF-8解码,所以解析不出来。


练习:

/*在java中,字符串“abcd”与字符串“ab你好”的长度是一样的,都是四个字符。
 * 但对应的字节数不同,一个汉字占两个字节。
 * 定义一个方法,按照最大的字节数来取字串。
 * 如:对于“ab你好”,如果取三个字节,那么字串就是ab与“你”字的半个。
 * 那么半个就要舍弃。如果去四个字节就是“ab你”,取五个字节还是“ab你”
 * 


 * 思路:
 * 因为代表汉字的字节为负数,又因为一个汉字两个字节。从后向前一次进行判断字符串的字节数是否为负数,并定义变量记录负数的个数,如果为偶数,则不舍弃,如果为      奇数则舍弃。
 * GBK编码表中有的汉字为一个负,一个正,下面方法同样适用。
 * 
 * */

(伪代码)
public static String  subStringByByte(String str,int len ) throws IOException { //len 表示最大字节数
byte[] bus = str.getBytes("gbk");
int count = 0;
for(int x = len-1;x>0;x--){
if(bus[x]<0){
count++;
}
else
break;

}
if(count%2==0)
return new String(bus,0,len,"gbk");
else
return new String(bus,0,len-1,"gbk");
/*如果为UTF-8
if(count%3==0)
return new String(bus,0,len,"gbk");
else if(count%3==1)
return new String(bus,0,len-1,"gbk");
else if(count&3==2)
return new String(bus,0,len-2,"gbk");
*/
}


0 0
原创粉丝点击