* 在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. Qt5.3.2_CentOS6.4_单步调试环境__20160306【勿删,繁琐】

    20160306 全程没有f/q ZC:使用的虚拟机环境是:博客园VMwareSkill 的 “CentOS6.4_x86_120g__20160306.rar” 需要调试器 gdb ,从“http: ...

  2. domContentload和onload

    defer和async <script src="script.js"></script> 没有 defer 或 async,浏览器会立即加载并执行指定的脚 ...

  3. 3-20 标准库:find库; 学习编程语言3节课(大多是旧识,全*栈)3-21 面向对象. Percent Strings; 元编程和Rails的相互理解

    Find The Find module supports the top-down traversal of a set of file paths.(一系列文件的路径的遍历) find(*path ...

  4. spoj Fast Multiplication

    题意:乘法 要用nlogn的fft乘法. //#pragma comment(linker,"/STACK:1024000000,1024000000") #include< ...

  5. 一些有趣的使用function

    转载来源:新人必看的短小而精悍的javascript function 1.回到顶部,优点使用浏览器刷新频率的requestAnimationFrame,很顺滑 const scrollToTop = ...

  6. Session问题-一个部门A登录后未注销另一个部门B再登录,以B的身份操作A的成员

    当管理员A登录后,打开某个管理界面.在A和B权限菜单相同的情况下,管理员B新开页面登录,session变为B的,然后切换到A打开的界面,不刷新的情况下可以操作A的数据. 解决方案:当浏览器登录后,即存 ...

  7. python 多线程稀疏矩阵乘法

    import threading, time import numpy as np res = [] class MyThread(threading.Thread): def __init__(se ...

  8. UVA-10273 Cyborg Genes (DP)

    题目大意:给两个字符串a.b,找出一个最短的字符串c,使得这两个字符串都是c的子序列.只需找出p的最小长度和最小长度时的个数. 题目分析:与LCS问题类似.最小长度的状态转移方程,dp(i,j)=mi ...

  9. POJ-2689 Prime Distance (两重筛素数,区间平移)

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13961   Accepted: 3725 D ...

  10. 数据库,ADO.NET(ADO),Oledb(Odbc)和编程语言关系框架图

    ---恢复内容开始--- ---恢复内容结束---