* 在Java中字符串“abcd”和字符串“ab你好”都是4个字符,
* 但是字节数不同,因为GBK中一个汉字占两个字节
* 定义一个方法用来按字节数截取字符串。
* 如:对于“ab你好”,取3个字节,“你”的字节只取了一半,无法正确显示,所以就把那个字节舍去
* 若取4个字节就是“ab你”,取5个字节还是“ab你”

 public class Test {

     public static void main(String[] args) throws UnsupportedEncodingException {
String str=new String("ab你好w琲天");
int len=str.getBytes("gbk").length;
for(int x=1;x<=len;x++){
System.out.println("GBK编码,截取"+x+"个字节数的结果是"+cutStringByBytes(str, x));
} int len2=str.getBytes("utf-8").length;
for(int x=1;x<=len2;x++){
System.out.println("utf-8编码,截取"+x+"个字节数的结果是"+cutStringU8StringByBytes(str, x));
} }
//对于utf-8编码,一个汉字三个字节,用int表示都是负数
public static String cutStringU8StringByBytes(String str, int len) throws UnsupportedEncodingException {
byte[] buf=str.getBytes("utf-8");
int count=0;
for(int i=len-1;i>=0;i--){
if(buf[i]<0)
count++;
else
break;
}
if(count%3==0){
return new String(buf,0,len,"utf-8");
}
else if(count%3==1)
return new String(buf,0,len-1,"utf-8");
else
return new String(buf,0,len-2,"utf-8");
} //对于GBK编码,汉字的编码大部分是两个负数(因为高位字节是1),其他是一个负数一个正数(比如“琲”)
public static String cutStringByBytes(String str, int len) throws UnsupportedEncodingException {
byte[] buf=str.getBytes("gbk");
int count=0;
for(int i=len-1;i>=0;i--){
if(buf[i]<0)
count++;
else
break;
}
if(count%2==0){
return new String(buf,0,len,"gbk");
}
else
return new String(buf,0,len-1,"gbk");
}
}

对于字符串“ab你好w琲天”的测试结果如下:

 GBK编码,截取1个字节数的结果是a
GBK编码,截取2个字节数的结果是ab
GBK编码,截取3个字节数的结果是ab
GBK编码,截取4个字节数的结果是ab你
GBK编码,截取5个字节数的结果是ab你
GBK编码,截取6个字节数的结果是ab你好
GBK编码,截取7个字节数的结果是ab你好w
GBK编码,截取8个字节数的结果是ab你好w
GBK编码,截取9个字节数的结果是ab你好w琲
GBK编码,截取10个字节数的结果是ab你好w琲
GBK编码,截取11个字节数的结果是ab你好w琲天 utf-8编码,截取1个字节数的结果是a
utf-8编码,截取2个字节数的结果是ab
utf-8编码,截取3个字节数的结果是ab
utf-8编码,截取4个字节数的结果是ab
utf-8编码,截取5个字节数的结果是ab你
utf-8编码,截取6个字节数的结果是ab你
utf-8编码,截取7个字节数的结果是ab你
utf-8编码,截取8个字节数的结果是ab你好
utf-8编码,截取9个字节数的结果是ab你好w
utf-8编码,截取10个字节数的结果是ab你好w
utf-8编码,截取11个字节数的结果是ab你好w
utf-8编码,截取12个字节数的结果是ab你好w琲
utf-8编码,截取13个字节数的结果是ab你好w琲
utf-8编码,截取14个字节数的结果是ab你好w琲
utf-8编码,截取15个字节数的结果是ab你好w琲天

IO练习--按字节截取字符串的更多相关文章

  1. javascript 高效按字节截取字符串

    做为一个前端开发人员在网页展示中经常会碰到,标题过长,需要截取字符串,用CSS的实现的话各种兼容问题,各种坑. 让后台程序截一下,又各种推托,让后台按字节截一下更是和要了后台老命一样,最后可能只会安字 ...

  2. java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”

    /*需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符.但对应的字节数不同,一个汉字占两个字节.定义一个方法,按照最大的字节数来取子串.如:对于“ab你好”,如果取三 ...

  3. C#、Java实现按字节截取字符串包含中文汉字和英文字符数字标点符号等

    C#.Java实现按字节截取字符串,字符串中包含中文汉字和英文字符数字标点符号等. 在实际项目应用过程中,尤其是在web开发时可能遇到的比较多,就以我的(JiYF笨小孩管理系统)为例,再发布文章时候, ...

  4. Java中根据字节截取字符串

    一.简介 为了统一世界各国的字符集,流行开了Unicode字符集,java也支持Unicode编码,即java中char存的是代码点值,即无论是‘A’还是‘中’都占两个字节. 代码点值:与Unicod ...

  5. Java按字节截取字符串(GBK编码、UTF-8编码实现)

    package FileDemo; import java.io.IOException; public class CutStringTest { /** * @param args * @thro ...

  6. java练习:质数,匿名内部类创建接口,抽象类派生子类,画圆,字节截取字符串,数字变钱币,五子棋,梭哈

    java学习-质数的孤独 正在看质数的孤独,,,于是写了一个练习代码,输出1-100之间的质数 代码比较烂.待完善吧. 这里用到了continue和break,continue指结束当前轮次循环,跳入 ...

  7. VB按字节截取字符串

    内容绝大部分来自互联网,出处请百度. 全角半角皆适用 Public Function bSubstring(ByVal s As String, ByVal length As Integer) As ...

  8. JS 根据字节 截取字符串函数

    function reBytesStr(str, len) { if ((!str && typeof(str) != 'undefined')) {return '';} var n ...

  9. C#按字节长度截取字符串

    产生这个问题的原因是将Substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了,导致长度变短. 两个扩展方法按字节长度截取字符串 /// <summary> /// 根 ...

随机推荐

  1. DDD领域模型和充血对象

    DDD领域模型 官方说法 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...

  2. java基础深入解析基本类型

    一.基本类型的简介 基本类型的两条准则: Java中,如果对整数不指定类型,默认时int类型,对小数不指定类型,默认是double类型. 基本类型由小到大,可以自动转换,但是由大到小,则需要强制类型转 ...

  3. CentOS系统-常用组件安装

    1,安装系统后,补装包组yum groupinstall "Compatibility libraries" "Base" "Development ...

  4. 手动添加 launcher 到 Ubuntu Unity

    本来,启动程序之后,在左边的launcher bar点右键,[Lock to Launcher]就可以的. 但是,有时候因为某种原因,需要手工添加. 这时候,就要参考下面的文章了 http://ask ...

  5. English trip -- VC(情景课)5 D

    Read 阅读 Listen and read. 听并读 Notice from Riverside Library Come and visit Riverside Library.The new ...

  6. sgu 126 Boxes

    题意:较大的容量减较小的容量,较小的容量翻倍.问操作几回其中一个空. 开始用set判重,重复就不可行.不过状态最多有2e18种.不仅爆内存,还超时.然后找规律.发现只有比例为1:1,1:3,1:7,3 ...

  7. Xshell如何设置,当连接断开时保留Session,保留原文字

    Xshell [1]  是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.Xshell 通过互联网到远程主机的安全连接以及它 ...

  8. maven 3.5.2 修改java_home

        修改mvn.cmd文件,找到: @REM ==== START VALIDATION ==== if not "%JAVA_HOME%" == "" g ...

  9. 数据库到jsp页面报错(一)

    数据库到jsp页面报错(一) 这个错误的确比较坑. 控制台:     页面: 解决: 神坑啊!!!

  10. OC MRC之 @property参数(代码分析)

    第一部分 // // main.m // 04-@property参数 // // Created by apple on 13-8-9. // Copyright (c) 2013年 itcast. ...