java,要实现字符串按字节截取的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java,要实现字符串按字节截取的方法相关的知识,希望对你有一定的参考价值。
String本来提供了按字符截取的substring方法,但这里要求实现按字节截取
我的思路是:
把字符串变成char[],数组遍历,判断每个元素占1个字节还是2个字节。
↓
占2个字节的字符,元素就替换成一个占1字节的占位符符号。
(中文字按字节截取总不能劈成两半吧?如果截取遇到占2个字节的却整个拿就不算按字节截取了)
↓
然后按照起始索引和最终索引拼合char数组元素,得到结果字符串。
这里最大的问题是:怎么去判断char类型所占字节长度??查了api Character类仍没有办法……
别复制粘贴过往问题,我看过了,没有满意的
/**
* 获取字符串的长度,如果有中文,则每个中文字符计为2位
*
* @param value
* 指定的字符串
* @return 字符串的长度
*/
int valueLength = 0;
int number = 0;
String chinese = "[\\u0391-\\uFFE5]";
/* 获取字段值的长度,如果含中文字符,则每个中文字符长度为2,否则为1 */
for (int q = 0; q < s7.length(); q++)
/* 获取一个字符 */
String temp = s7.substring(q, q + 1);
/* 判断是否为中文字符 */
if (temp.matches(chinese))
/* 中文字符长度为2 */
valueLength += 2;
//返回这个字符串中有几个汉字
number+=1;
else
/* 其他字符长度为1 */
valueLength += 1;
return number;
参考技术C var max = rules[i + 1];
//var len = field.val().length; //原有的校验
//新增的校验
//add by songyf 2013.09.12 修改maxSize 实现中英文字符长度的判断
//区分全角半角字符
var str = field.val();
var strlength=0;
for (var j=0;j<str.length;j++)
var charCode = str.charCodeAt(j);
if(charCode>=0 && charCode<=128)
strlength = strlength+1;
else
strlength=strlength + 2;
var len = strlength;
这串代码中有部分可以区分是中文字符还是英文字符 ,你看有可以用到的吗 参考技术D 占几个字节是由编码方案决定的。常见的GBK,UTF8 , UTF16各不相同。 第5个回答 2013-09-29 为啥要用char? 把一个个String截出来getbytes一下。。。本回答被提问者采纳
java 字符串截取
java 字符串截取(当遇到截取半个汉字的处理)方法2舍去(项目中用的)
方法1是看的别人的,个人认为方法1简洁
package everyDay;
import java.io.UnsupportedEncodingException;
/**
* * 题目:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
GB2312、GBK、GB18030,CP936以及CNS11643都满足条件 -- 中文是占用2个字节的,英文是占用1一个字节 。
因为中文转换为byte字节,随着编码的不同,转换的字节长度也会不通,如编码为UTF-8,一个中文字符串转换为byte占三个字节.
*
*/
public class LearnCSplit {
/**
* 方法1,比方法2简洁
* @param text
* 目标字符串
* @param length
* 截取长度
* @param encode
* 采用的编码方式
* @return
* @throws UnsupportedEncodingException
*/
private static String substring(String str, int length1, String code) throws UnsupportedEncodingException {
if (str==null) {
return null;
}
StringBuilder sb=new StringBuilder();
int currentLength=0;
for (char c : str.toCharArray()) {
currentLength+=String.valueOf(c).getBytes(code).length;
if (currentLength<=length1) {
sb.append(c);
}else {
break;
}
}
return sb.toString();
}
public static void main(String[] args) throws UnsupportedEncodingException {
//StringBuilder sb=null;//线程不安全,性能高
String str="我ABC汉DEF";
int length1=3;
int length2=6;
String [] codes=new String[]{"GB2312","GBK","GB18030","CP936","CNS11643","UTF-8"};
for (String code : codes) {
System.out.println(new StringBuilder().append("用").append(code)
.append("编码截取字符串--【“").append(str).append("】")
.append(length1).append("个字节的结果是【")
.append(substring(str,length1,code)).append("】").toString());
System.out.println(new StringBuilder().append("用").append(code)
.append("编码截取字符串--【“").append(str).append("】")
.append(length2).append("个字节的结果是【")
.append(substring(str,length2,code)).append("】").toString());
}
////以上是方法1的
String value="乌鲁木齐测试测试开发资源服务有限责任公司达坂城分公司1A2b3";
//统计字节数
int countBytes=conutByte(value);
//已知字段长度40个字节
if (countBytes>40) {
value=substr(value,0,40);
System.out.println("输出指定字段长度的字符串:"+value);
}
}
/**
* 统计字节数
* @param value
* @return
*/
private static int conutByte(String value) {
if (value==null) {
return 0;
}
byte[] bs;
try {
bs = value.getBytes("GB18030");
int lenbs=bs.length;
return lenbs;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
/**
* 截取字符
* @param str
* @param begin
* @param zdcd
* @return
*/
private static String substr(String str, int begin, int zdcd) {
if (str == null) {
return str;
}
String str2;
str=getSubString(str,zdcd);//截取指定字节长度的字符串,不能返回半个汉字20
zdcd=conutByte(str);//再从新计算字节个数,19
//我去恶趣味123我我去
byte[] bs;
try {
bs = str.getBytes("GB18030");
str2 = new String(bs, begin, zdcd, "GB18030");
return str2;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
}
/**
* <b>截取指定字节长度的字符串,不能返回半个汉字</b>
* @param str
* @param zdcd
* @return
*/
private static String getSubString(String str, int zdcd) {
int count=0;
int offset=0;
char[] c=str.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i]>256) {
offset=2;
count+=2;
}else{
offset=1;
count++;
}
if (count==zdcd) {
return str.substring(0, i+1);
}
if ((count==zdcd+1 && offset==2)) {
return str.substring(0, i);
}
}
return "";
}
}
控制台输出结果:
用GB2312编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
用GB2312编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
用GBK编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
用GBK编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
用GB18030编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
用GB18030编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
用CP936编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
用CP936编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
用CNS11643编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我A】
用CNS11643编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
用UTF-8编码截取字符串--【“我ABC汉DEF】3个字节的结果是【我】
用UTF-8编码截取字符串--【“我ABC汉DEF】6个字节的结果是【我ABC】
输出指定字段长度的字符串:乌鲁木齐测试测试开发资源服务有限责任公司
方法3:截取指定长度的字符串
public class CharactersSplit {
public static void main(String[] args) {
String value="乌鲁a木齐 同盛人力资源服务有限责任公司达坂城分公司1A2b3";//24+6+2=32
//value=getSubString(value,value.toCharArray().length);//乌鲁a木齐 同
value=getSubString(value,89);
//value=value.substring(0, 6);//乌鲁a木齐 同//这如果是89就会报下标越界
System.out.println(value);
}
/**
*Description:截取指定长度的字符串
* 与字符串 substring 方法相比,可以规长度不够截取出现的下标越界等问题
*/
public static String getSubString(String sOurce, int len) {
if (sOurce.isEmpty()) {
return "";
}
if (sOurce.length() <= len) {//32=32
// sOurce.length()=value.toCharArray().length
return sOurce;
}
return sOurce.substring(0, len);
}
}
运行输出结果:乌鲁a木齐 同盛人力资源服务有限责任公司达坂城分公司1A2b3
以上是关于java,要实现字符串按字节截取的方法的主要内容,如果未能解决你的问题,请参考以下文章
用java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保
【急求】java 按字节截取字符串,从指定的位置开始,到指定的位置结束
java算法面试题:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个, 如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该