IO练习--按字节截取字符串
2017-04-06 15:52
253 查看
* 在Java中字符串“abcd”和字符串“ab你好”都是4个字符,
* 但是字节数不同,因为GBK中一个汉字占两个字节
* 定义一个方法用来按字节数截取字符串。
* 如:对于“ab你好”,取3个字节,“你”的字节只取了一半,无法正确显示,所以就把那个字节舍去
* 若取4个字节就是“ab你”,取5个字节还是“ab你”
对于字符串“ab你好w琲天”的测试结果如下:
* 但是字节数不同,因为GBK中一个汉字占两个字节
* 定义一个方法用来按字节数截取字符串。
* 如:对于“ab你好”,取3个字节,“你”的字节只取了一半,无法正确显示,所以就把那个字节舍去
* 若取4个字节就是“ab你”,取5个字节还是“ab你”
1 public class Test { 2 3 public static void main(String[] args) throws UnsupportedEncodingException { 4 String str=new String("ab你好w琲天"); 5 int len=str.getBytes("gbk").length; 6 for(int x=1;x<=len;x++){ 7 System.out.println("GBK编码,截取"+x+"个字节数的结果是"+cutStringByBytes(str, x)); 8 } 9 10 int len2=str.getBytes("utf-8").length; 11 for(int x=1;x<=len2;x++){ 12 System.out.println("utf-8编码,截取"+x+"个字节数的结果是"+cutStringU8StringByBytes(str, x)); 13 } 14 15 } 16 //对于utf-8编码,一个汉字三个字节,用int表示都是负数 17 public static String cutStringU8StringByBytes(String str, int len) throws UnsupportedEncodingException { 18 byte[] buf=str.getBytes("utf-8"); 19 int count=0; 20 for(int i=len-1;i>=0;i--){ 21 if(buf[i]<0) 22 count++; 23 else 24 break; 25 } 26 if(count%3==0){ 27 return new String(buf,0,len,"utf-8"); 28 } 29 else if(count%3==1) 30 return new String(buf,0,len-1,"utf-8"); 31 else 32 return new String(buf,0,len-2,"utf-8"); 33 } 34 35 //对于GBK编码,汉字的编码大部分是两个负数(因为高位字节是1),其他是一个负数一个正数(比如“琲”) 36 public static String cutStringByBytes(String str, int len) throws UnsupportedEncodingException { 37 byte[] buf=str.getBytes("gbk"); 38 int count=0; 39 for(int i=len-1;i>=0;i--){ 40 if(buf[i]<0) 41 count++; 42 else 43 break; 44 } 45 if(count%2==0){ 46 return new String(buf,0,len,"gbk"); 47 } 48 else 49 return new String(buf,0,len-1,"gbk"); 50 } 51 }
对于字符串“ab你好w琲天”的测试结果如下:
1 GBK编码,截取1个字节数的结果是a 2 GBK编码,截取2个字节数的结果是ab 3 GBK编码,截取3个字节数的结果是ab 4 GBK编码,截取4个字节数的结果是ab你 5 GBK编码,截取5个字节数的结果是ab你 6 GBK编码,截取6个字节数的结果是ab你好 7 GBK编码,截取7个字节数的结果是ab你好w 8 GBK编码,截取8个字节数的结果是ab你好w 9 GBK编码,截取9个字节数的结果是ab你好w琲 10 GBK编码,截取10个字节数的结果是ab你好w琲 11 GBK编码,截取11个字节数的结果是ab你好w琲天 12 13 utf-8编码,截取1个字节数的结果是a 14 utf-8编码,截取2个字节数的结果是ab 15 utf-8编码,截取3个字节数的结果是ab 16 utf-8编码,截取4个字节数的结果是ab 17 utf-8编码,截取5个字节数的结果是ab你 18 utf-8编码,截取6个字节数的结果是ab你 19 utf-8编码,截取7个字节数的结果是ab你 20 utf-8编码,截取8个字节数的结果是ab你好 21 utf-8编码,截取9个字节数的结果是ab你好w 22 utf-8编码,截取10个字节数的结果是ab你好w 23 utf-8编码,截取11个字节数的结果是ab你好w 24 utf-8编码,截取12个字节数的结果是ab你好w琲 25 utf-8编码,截取13个字节数的结果是ab你好w琲 26 utf-8编码,截取14个字节数的结果是ab你好w琲 27 utf-8编码,截取15个字节数的结果是ab你好w琲天
相关文章推荐
- 华为机试练习---按字节数截取字符串
- 24-IO流-70-IO流(练习-按字节截取字符串)
- 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串
- JAVA中按字节截取字符串
- 向C#的String类添加按字节截取字符串的扩展方法
- 用Java实现按字节长度截取字符串的方法
- 向C#的String类添加按字节截取字符串的扩展方法
- 截取双字节字符串
- VB.NET按字节截取字符串
- [函数]截取固定长的字符串(双字节的计2位)
- 按字节长度截取字符串
- java中使用字节方式截取字符串
- java中按字节数的长度来截取字符串,并以...来忽略
- 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”
- php字符串截取中文截取2,单字节截取模式
- 按指定长度截取字符串(以字节计算长度)
- 按字节长度截取字符串(支持截取带HTML代码样式的字符串)
- php字符串截取中文截取2,单字节截取模式
- 按字节长度截取字符串(支持截取带HTML代码样式的字符串)
- java中按字节截取String字符串.