编码问题
2016-05-26 22:31
260 查看
编码
字符-->字节数组
解码
字节数组-->字符
//编码
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");
*/
}
字符-->字节数组
解码
字节数组-->字符
//编码
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");
*/
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树