* 在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. Java 常用对象-Date类和Calender类

    2017-11-02 22:29:34 Date类:类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值 ...

  2. 3.2 x86体系结构

    计算机组成 3 指令系统体系结构 3.2 x86体系结构 X86是商业上最为成功,影响力最大的一种体系结构.但从技术的角度看,它又存在着很多的问题,那我们就来一起分析X86这种体系结构的特点. 要探讨 ...

  3. GetImageURL

    Sub GetImageUrl(ByVal URL As String) Dim strText As String Dim i As Long Dim OneImg With CreateObjec ...

  4. android之视频播放系统VideoView和自定义VideoView控件的应用

    Android播放视频,包含系统自带VideoView控件,和自定义VideoView控件,可全屏播放,案例包含了本地视频和网络视频. 1:自定义VideoView控件 2:布局代码 3:Activi ...

  5. 最应该注意的Oracle版本之一

    最近以来,两个用户的库接连出现问题,经过查阅资料和分析,确定为数据库bug所致,其实,早在很久前,也遭遇过这个版本的类似bug,当时似乎还惊动了原厂的技术人员,后来确定为这个版本的bug,这个版本就是 ...

  6. JavaScript学习总结(七)——JavaScript函数(function)

    一.函数基本概念 为完成某一功能的程序指令(语句)的集合,称为函数. 二.JavaScript函数的分类 1.自定义函数(我们自己编写的函数),如:function funName(){} 2.系统函 ...

  7. linux和window是文件挂载

    1. 首先在windows下面创建share文件夹并设置共享(右键->属性->共享)2. 确认ubuntu安装了mount.cifs,apt-get install mount.cifs ...

  8. 微信小程序跨页面获取数据示例

    index.wxml <navigator class="navs" url="{{urls}}"> 中国 </navigator> i ...

  9. sgu101 欧拉路径 难度:1

    101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...

  10. 弹出层小插件之(一)sweetalert

    //弹出层小插件之(一)sweetalert 1.引入sweetalert.css 2.引入sweetalert.min.js 下载地址:http://t4t5.github.io/sweetaler ...