-
2021-03-04 02:41:38
package sys;
import java.io.UnsupportedEncodingException;
/**
* :编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的
* 字符串。但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC 汉
* DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”
*
* @author JYA
*
*/
public class A {
public String SplitIt2(String splitStr, int subInt) {
// if (subInt > splitStr.getBytes().length) {
// return splitStr;
// }
StringBuilder sb = new StringBuilder("");
int k = 0;
String str = "";
for (int i = 0; i
if (i
str = splitStr.substring(i, i + 1);
k += str.getBytes().length;
if (k <= subInt) {
sb.append(str);
} else {
break;
}
}
}
return sb.toString();
}
public static void main(String[] args) throws UnsupportedEncodingException {
A ss = new A();
System.out.println(ss.SplitIt2("测试阿什11顿拉", 40));
// System.out.println(Pattern.matches("[^\\x00-\\xff]", "阿"));
// System.out.println(isChinese(","));
}
public static boolean isChinese(String str) {
char[] k = str.toCharArray();
for (int i = 0; i
// if ('\u4e00' > k[i] || k[i] > '\u9fa5') {
// return false;
// }
if ('\uFE30' > k[i] || k[i] > '\uFFA0') {
return false;
}
}
return true;
}
}
更多相关内容 -
java按字节截取带有汉字的字符串的解法(推荐)
2020-09-01 17:02:44下面小编就为大家带来一篇java按字节截取带有汉字的字符串的解法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
java中截取带汉字的字符串
2011-07-04 18:52:21解决截取字符串中带有汉字的问题,以防截取时汉字截取一般出现错误情况 -
求截取带中文的字符串的java方法。
2021-03-10 02:49:23首先我谈谈我对上面9个例e69da5e6ba9062616964757a686964616f31333262373265子的理解,即这个方法应该实现的功能:这个方法与JDKString原有的方法substring是有区别的,在这个方法里,一个中文汉字相当于占2个英文...展开全部
楼主你好,很高兴能回答你这个很有挑战性的问题,首先我谈谈我对上面9个例e69da5e6ba9062616964757a686964616f31333262373265子的理解,即这个方法应该实现的功能:
这个方法与JDK String原有的方法substring是有区别的,在这个方法里,一个中文汉字相当于占2个英文字符的位置。而且根据方法传入的参数pStart和pEnd在返回相应的子字符串child
如果pstart刚好在某个汉字的前半部分,则child应包含该汉字,在后部分则不含。与之相对应的是pEnd如果在某个汉字的后半部分,则child应含该汉字,否则不包含,如果pStart超出pStr的长度(这里一个汉字长度算2),则返回空,其他性质和JDK的性质形同。
如果觉得我的理解不错,且看下面的代码:
public class Test{
public Test(){
String str="ABCDE";
String str2="ABC你D";
String str3="A你B好C吗勇DE";
System.out.println("1 str='ABCDE' start=1 end=5 结果:"+getSubString(str,1,5));
System.out.println("2 str='ABCDE' start=1 end=4 结果:"+getSubString(str,1,4));
System.out.println("3 str='ABCDE' start=2 end=4 结果:"+getSubString(str,2,4));
System.out.println("4 str='ABCDE' start=6 end=7 结果:"+getSubString(str,6,7));
System.out.println("5 str='ABCDE' start=5 end=5 结果:"+getSubString(str,5,5));
System.out.println("6 str2='ABC你D' start=1 end=3 结果:"+getSubString(str2,1,3));
System.out.println("7 str2='ABC你D' start=1 end=4 结果:"+getSubString(str2,1,4));
System.out.println("8 str2='ABC你D' start=1 end=5 结果:"+getSubString(str2,1,5));
System.out.println("9 str2='ABC你D' start=4 end=4 结果:"+getSubString(str2,4,4));
System.out.println("10 str3='A你B好C吗勇DE' start=9 end=10 结果:"+getSubString(str3,9,10));
}
public static void main(String args[]){
new Test();
}
public String getSubString(String str,int pstart,int pend){
String resu="";
int beg=0;
int end=0;
int count1=0;
char[] temp=new char[str.length()];
str.getChars(0,str.length(),temp,0);
boolean[] bol=new boolean[str.length()];
for(int i=0;i
bol[i]=false;
if((int)temp[i]>255){//说明是中文
count1++;
bol[i]=true;
}
}
if(pstart>str.length()+count1){
resu=null;
}
if(pstart>pend){
resu=null;
}
if(pstart<1){
beg=0;
}else{
beg=pstart-1;
}
if(pend>str.length()+count1){
end=str.length()+count1;
}else{
end=pend;//在substring的末尾一样
}
//下面开始求应该返回的字符串
if(resu!=null){
if(beg==end){
int count=0;
if(beg==0){
if(bol[0]==true)
resu=null;
else
resu=new String(temp,0,1);
}else{
int len=beg;//zheli
for(int y=0;y
if(bol[y]==true)
count++;
len--;//想明白为什么len--
}
//for循环运行完毕后,len的值就代表在正常字符串中,目标beg的上一字符的索引值
if(count==0){//说明前面没有中文
if((int)temp[beg]>255)//说明自己是中文
resu=null;//返回空
else
resu=new String(temp,beg,1);
}else{//前面有中文,那么一个中文应与2个字符相对
if((int)temp[len+1]>255)//说明自己是中文
resu=null;//返回空
else
resu=new String(temp,len+1,1);
}
}
}else{//下面是正常情况下的比较
int temSt=beg;
int temEd=end-1;//这里减掉一
for(int i=0;i
if(bol[i]==true)
temSt--;
}//循环完毕后temSt表示前字符的正常索引
for(int j=0;j
if(bol[j]==true)
temEd--;
}//循环完毕后temEd-1表示最后字符的正常索引
if(bol[temSt]==true)//说明是字符,说明索引本身是汉字的后半部分,那么应该是不能取的
{
int cont=0;
for(int i=0;i<=temSt;i++){
cont++;
if(bol[i]==true)
cont++;
}
if(pstart==cont)//是偶数不应包含,如果pstart
temSt++;//从下一位开始
}
if(bol[temEd]==true){//因为temEd表示substring 的最面参数,此处是一个汉字,下面要确定是否应该含这个汉字
int cont=0;
for(int i=0;i<=temEd;i++){
cont++;
if(bol[i]==true)
cont++;
}
if(pend
temEd--;//所以只取到前一个
}
if(temSt==temEd){
resu=new String(temp,temSt,1);
}else if(temSt>temEd){
resu=null;
}else{
resu=str.substring(temSt,temEd+1);
}
}
}
return resu;//返回结果
}
}
测试结果如图,并且可以任意修改字符串,保证结果正确。
That's all !
-
按字节截取混有中文汉字的字符串 中英文字符串截取
2021-03-01 07:51:40[java]代码库import java.io....public class CutString {/*** 判断是否是一个中文汉字** @param c* 字符* @return true表示是中文汉字,false表示是英文字母* @throws UnsupportedEncodingException* ...[java]代码库import java.io.UnsupportedEncodingException;
public class CutString {
/**
* 判断是否是一个中文汉字
*
* @param c
* 字符
* @return true表示是中文汉字,false表示是英文字母
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static boolean isChineseChar(char c)
throws UnsupportedEncodingException {
// 如果字节数大于1,是汉字
// 以这种方式区别英文字母和中文汉字并不是十分严谨,但在这个题目中,这样判断已经足够了
return String.valueOf(c).getBytes("GBK").length > 1;
}
/**
* 按字节截取字符串
*
* @param orignal
* 原始字符串
* @param count
* 截取位数
* @return 截取后的字符串
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static String substring(String orignal, int count)
throws UnsupportedEncodingException {
// 原始字符不为null,也不是空字符串
if (orignal != null && !"".equals(orignal)) {
// 将原始字符串转换为GBK编码格式
orignal = new String(orignal.getBytes(), "GBK");
// 要截取的字节数大于0,且小于原始字符串的字节数
if (count > 0 && count < orignal.getBytes("GBK").length) {
StringBuffer buff = new StringBuffer();
char c;
for (int i = 0; i < count; i++) {
// charAt(int index)也是按照字符来分解字符串的
c = orignal.charAt(i);
buff.append(c);
if (CutString.isChineseChar(c)) {
// 遇到中文汉字,截取字节总数减1
--count;
}
}
return buff.toString();
}
}
return orignal;
}
public static void main(String[] args) {
// 原始字符串
String s = "我ZWR爱JAVA";
System.out.println("原始字符串:" + s);
try {
System.out.println("截取前1位:" + CutString.substring(s, 1));
System.out.println("截取前2位:" + CutString.substring(s, 2));
System.out.println("截取前4位:" + CutString.substring(s, 4));
System.out.println("截取前6位:" + CutString.substring(s, 6));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
-
java按字节截取带有汉字的字符串的解法
2021-02-12 21:25:54由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串。自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度必须小与...由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串。
自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度必须小与数据库的字节长度,即如果最后一个字符为汉字,那么只能去掉往前截取。
/**
* 判断传进来的字符串,是否
* 大于指定的字节,如果大于递归调用
* 直到小于指定字节数 ,一定要指定字符编码,因为各个系统字符编码都不一样,字节数也不一样
* @param s
* 原始字符串
* @param num
* 传进来指定字节数
* @return String 截取后的字符串
* @throws UnsupportedEncodingException
*/
public static String idgui(String s,int num)throws Exception{
int changdu = s.getBytes("UTF-8").length;
if(changdu > num){
s = s.substring(0, s.length() - 1);
s = idgui(s,num);
}
return s;
}
http://blog.csdn.net/yangyan19870319/article/details/6144131
java面试题:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。
目前很多流行的语言,如C#、Java内部采用的都是 Unicode 16(UCS2)编码,在这种编码中所有的字符都是两个字符,因此,如果要截取的字符串是中、英文、数字混合的,就会产生问题,如下面的字符串:
String s = "a加b等于c,如果a等1、b等于2,那么c等3";
上面的字符串既有汉字,又有英文字符和数字。如果要截取前6个字节的字符,应该是”a加b等",但如果用substring方法截取前6个字符就成了"a 加b等于c"。产生这个问题的原因是将substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了。
英文字母和中文汉字在不同的编码格式下,所占用的字节数也是不同的,我们可以通过下面的例子来看看在一些常见的编码格式下,一个英文字母和一个中文汉字分别占用多少字节。
Java代码
importjava.io.UnsupportedEncodingException;
publicclassEncodeTest {
/**
* 打印字符串在指定编码下的字节数和编码名称到控制台
*
* @param s
* 字符串
* @param encodingName
* 编码格式
*/
publicstaticvoidprintByteLength(String s, String encodingName) {
System.out.print("字节数:");
try{
System.out.print(s.getBytes(encodingName).length);
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(";编码:"+ encodingName);
}
publicstaticvoidmain(String[] args) {
String en ="A";
String ch ="人";
// 计算一个英文字母在各种编码下的字节数
System.out.println("英文字母:"+ en);
EncodeTest.printByteLength(en,"GB2312");
EncodeTest.printByteLength(en,"GBK");
EncodeTest.printByteLength(en,"GB18030");
EncodeTest.printByteLength(en,"ISO-8859-1");
EncodeTest.printByteLength(en,"UTF-8");
EncodeTest.printByteLength(en,"UTF-16");
EncodeTest.printByteLength(en,"UTF-16BE");
EncodeTest.printByteLength(en,"UTF-16LE");
System.out.println();
// 计算一个中文汉字在各种编码下的字节数
System.out.println("中文汉字:"+ ch);
EncodeTest.printByteLength(ch,"GB2312");
EncodeTest.printByteLength(ch,"GBK");
EncodeTest.printByteLength(ch,"GB18030");
EncodeTest.printByteLength(ch,"ISO-8859-1");
EncodeTest.printByteLength(ch,"UTF-8");
EncodeTest.printByteLength(ch,"UTF-16");
EncodeTest.printByteLength(ch,"UTF-16BE");
EncodeTest.printByteLength(ch,"UTF-16LE");
}
}
运行结果如下:
英文字母:A
字节数:1;编码:GB2312
字节数:1;编码:GBK
字节数:1;编码:GB18030
字节数:1;编码:ISO-8859-1
字节数:1;编码:UTF-8
字节数:4;编码:UTF-16
字节数:2;编码:UTF-16BE
字节数:2;编码:UTF-16LE
中文汉字:人
字节数:2;编码:GB2312
字节数:2;编码:GBK
字节数:2;编码:GB18030
字节数:1;编码:ISO-8859-1
字节数:3;编码:UTF-8
字节数:4;编码:UTF-16
字节数:2;编码:UTF-16BE
字节数:2;编码:UTF-16LE
UTF-16BE和UTF-16LE是UNICODE编码家族的两个成员。UNICODE标准定义了UTF-8、UTF-16、UTF-32三种编码格式,共有UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE七种编码方案。JAVA所采用的编码方案是UTF-16BE。从上例的运行结果中我们可以看出,GB2312、GBK、GB18030三种编码格式都可以满足题目的要求。下面我们就以GBK编码为例来进行解答。
我们不能直接使用String类的substring(int beginIndex, int endIndex)方法,因为它是按字符截取的。'我'和'Z'都被作为一个字符来看待,length都是1。实际上我们只要能区分开中文汉字和英文字母,这个问题就迎刃而解了,而它们的区别就是,中文汉字是两个字节,英文字母是一个字节。
package com.newyulong.iptv.billing.ftpupload;
import java.io.UnsupportedEncodingException;
public class CutString {
/**
* 判断是否是一个中文汉字
*
* @param c
* 字符
* @return true表示是中文汉字,false表示是英文字母
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static boolean isChineseChar(char c)
throws UnsupportedEncodingException {
// 如果字节数大于1,是汉字
// 以这种方式区别英文字母和中文汉字并不是十分严谨,但在这个题目中,这样判断已经足够了
return String.valueOf(c).getBytes("UTF-8").length > 1;
}
/**
* 按字节截取字符串
*
* @param orignal
* 原始字符串
* @param count
* 截取位数
* @return 截取后的字符串
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static String substring(String orignal, int count)
throws UnsupportedEncodingException {
// 原始字符不为null,也不是空字符串
if (orignal != null && !"".equals(orignal)) {
// 将原始字符串转换为GBK编码格式
orignal = new String(orignal.getBytes(), "UTF-8");//
// System.out.println(orignal);
//System.out.println(orignal.getBytes().length);
// 要截取的字节数大于0,且小于原始字符串的字节数
if (count > 0 && count < orignal.getBytes("UTF-8").length) {
StringBuffer buff = new StringBuffer();
char c;
for (int i = 0; i < count; i++) {
System.out.println(count);
c = orignal.charAt(i);
buff.append(c);
if (CutString.isChineseChar(c)) {
// 遇到中文汉字,截取字节总数减1
--count;
}
}
// System.out.println(new String(buff.toString().getBytes("GBK"),"UTF-8"));
return new String(buff.toString().getBytes(),"UTF-8");
}
}
return orignal;
}
/**
* 按字节截取字符串
*
* @param orignal
* 原始字符串
* @param count
* 截取位数
* @return 截取后的字符串
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static String gsubstring(String orignal, int count)
throws UnsupportedEncodingException {
// 原始字符不为null,也不是空字符串
if (orignal != null && !"".equals(orignal)) {
// 将原始字符串转换为GBK编码格式
orignal = new String(orignal.getBytes(), "GBK");
// 要截取的字节数大于0,且小于原始字符串的字节数
if (count > 0 && count < orignal.getBytes("GBK").length) {
StringBuffer buff = new StringBuffer();
char c;
for (int i = 0; i < count; i++) {
c = orignal.charAt(i);
buff.append(c);
if (CutString.isChineseChar(c)) {
// 遇到中文汉字,截取字节总数减1
--count;
}
}
return buff.toString();
}
}
return orignal;
}
/**
* 判断传进来的字符串,是否
* 大于指定的字节,如果大于递归调用
* 直到小于指定字节数
* @param s
* 原始字符串
* @param num
* 传进来指定字节数
* @return String 截取后的字符串
*/
public static String idgui(String s,int num){
int changdu = s.getBytes().length;
if(changdu > num){
s = s.substring(0, s.length() - 1);
s = idgui(s,num);
}
return s;
}
public static void main(String[] args) throws Exception{
// 原始字符串
String s = "我ZWR爱你们JAVA";
System.out.println("原始字符串:" + s + " : 字节数是: " + s.getBytes().length);
/* System.out.println("截取前1位:" + CutString.substring(s, 1));
System.out.println("截取前2位:" + CutString.substring(s, 2));
System.out.println("截取前4位:" + CutString.substring(s, 4)); */
//System.out.println("截取前12位:" + CutString.substring(s, 12));
System.out.println("截取前12字节:" + CutString.idgui(s, 11));
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
-
关于java按字节截取带有汉字的字符串的解法
2009-03-16 16:43:21关于java按字节截取带有汉字的字符串的解法.不错的一个程序。我也是从高手那拿来的,觉得不错,传上来给感兴趣的朋友学习学习。 -
Java 分割字符串---按字节长度分割带有中文字符串
2022-04-11 22:43:48中文在不同编码中占用的字节数是不同的,GBK编码中,一个汉字占两个字节,UTF-8编码格式中,一个汉字占3个字节。 public static List<String> chineseSplitFunction(String src,String byteType, int bytes){... -
c++中string截取带有中文字符串的解决方案
2020-01-10 19:17:35关于截取带有中文字符字符串问题 最近在做东西时候碰到了一个问题,当字符串中有中文,要截取固定长度的字符串,不能截取半截的字符串,在百度上也看了看,没有用c和c++实现的,几乎都是java,直接转一下类型就行... -
Java 分割字符串---按字节长度分割带有中文字符串,中文不乱码
2021-02-12 20:51:28如果我们按照字节数来截取带中文的字符串,就有可能截取了半个或者三分之一个汉字,导致乱码的出现。package com.java.string.split;import java.util.ArrayList;import java.util.List;public class ChineseSplit {... -
Java按字节数截取字符串,一个中文长度为2
2021-02-28 15:08:52如"我ABC汉字d"这个字符串,截取5个字节的时候,应该是"我ABC",而截取8个字节的时候,应该是"我ABC汉",而不应该是"我ABC汉?",其中"?"为半个汉字,可理解为向前截取public static String subStr(String str, ... -
如何截取包含中文的字符串(保证汉子不被截半个)
2020-10-23 17:31:25编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节数截取的字符串。但是要保证汉子不被截半个。 分析: 在java语言中,默认使用的unicode编码方式,即每个字符占两个字节,因此可以用来... -
java截取两个字符中间的字符串 及正则表达式
2019-09-10 11:20:49package com.starit.analyse.util... import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ... -
中文字符串截取
2021-01-27 19:34:14java多字节字符串按字节截取算法思路1.先按照实际要截取的字节长度,复制一份字节数组2.转换回字符串,计算字符长度resLen,并按这个长度截取原字符串3.计算截取的字符串的字节数是否等于需求长度len,相等则直接... -
用Java实现按字节长度截取中英文数字字符串的方法总结
2021-04-22 11:57:07用Java实现按字节长度截取中英文数字字符串的方法总结用Java实现按字节长度截取中英文数字字符串的方法总结方法一//jdk1.4.2.05Java代码/***@authorcn*@params要截取的字符串*@paramlength要截取字符串的长度->... -
截取字符串中带汉字的字符串,按照字节进行截取
2019-02-27 09:48:35在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。 但对应的字节数不同,一个汉字占两个字节。 定义一个方法,按照最大的字节数来取子串。 如:对于“ab你好”,如果取三个字节,那么子串... -
截取字符串时,截取完整的表情符
2022-02-21 13:29:46截取字符串时,有时候字符串会包含Emoji表情、以及一些特殊符号,用String的substring()进行截取操作,结果就有可能是乱码。这是因为JVM运行时使用UTF-16编码,对于普通的字符都是使用char类型存储(2个字节),而... -
js 截取 前前后后 空格 获取字符串长度
2021-03-17 17:09:06// 去除字符串前后空格?? ?Trim : function(sSubStr){?? ??? ?var lsStr = '';?? ??? ?var StrTrim = document.getElementById(sSubStr);?? ??? ??? ?if(StrTrim!= null){?????????? // lsStr = StrTrim.... -
按字节截取带有中文字符的字符串
2016-11-28 20:27:58编写一个函数,要求输入一个字符串和字节数,输出该字节个数的子字 -
Java截取含有汉字的字符串。
2008-11-13 16:43:00编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉... -
Java编程笔记11:字符串
2022-01-28 20:27:52Java编程笔记11:字符串 图源:PHP中文网 字符串连接 字符串连接是程序中最常使用的对字符串的操作,看一个最简单的例子: package ch11.conn; public class Main { public static void main(String[] args) { ... -
java获取含有中文字符串长度
2018-06-28 10:16:59为方便合同用,我们写一个Utils类;... * 获取字符串的长度,如果有中文,则每个中文字符计为2位 * @param value 指定的字符串 * @return 字符串的长度 */ public static int length(String value) { ... -
[原]Java面试题-将字符串中数字提取出来排序后输出
2021-03-12 20:35:33【Title】[原]Java面试题-将字符串中数字提取出来排序后输出【Date】2013-09-15【Abstract】很简单的面试题,要求现场在纸上写出来。【Keywords】面试、Java、排序【Environment】Windows 7 、 JDK6【Author】wintys... -
java截取含有汉字的字符串
2012-10-19 12:20:41//标记字符串中汉字的个数 byte[] b1 = str.getBytes(); for(int i = 0;i();){ char c = str.charAt(i); if(String.valueOf(c).getBytes().length==2){ i+=2; j++; }else{ i++; } ...