精华内容
下载资源
问答
  • 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按字节截取带有汉字字符串的解法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 解决截取字符串带有汉字的问题,以防截取时汉字截取一般出现错误情况
  • 截取带中文字符串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 !

    7236f9a524a32a3f91faffca3faefc5c.png

    展开全文
  • [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();

    }

    }

    }

    694748ed64b9390909c0d88230893790.png

    展开全文
  • 由于接口使用的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代码 icon_copy.gif

    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按字节截取带有汉字字符串的解法.不错的一个程序。我也是从高手那拿来的,觉得不错,传上来给感兴趣的朋友学习学习。
  • 中文在不同编码中占用的字节数是不同的,GBK编码中,一个汉字占两个字节,UTF-8编码格式中,一个汉字占3个字节。 public static List<String> chineseSplitFunction(String src,String byteType, int bytes){...
  • 关于截取带有中文字符字符串问题  最近在做东西时候碰到了一个问题,当字符串中有中文,要截取固定长度的字符串,不能截取半截的字符串,在百度上也看了看,没有用c和c++实现的,几乎都是java,直接转一下类型就行...
  • 如果我们按照字节数来截取带中文字符串,就可能截取了半个或者三分之一个汉字,导致乱码的出现。package com.java.string.split;import java.util.ArrayList;import java.util.List;public class ChineseSplit {...
  • 如"我ABC汉字d"这个字符串截取5个字节的时候,应该是"我ABC",而截取8个字节的时候,应该是"我ABC汉",而不应该是"我ABC汉?",其中"?"为半个汉字,可理解为向前截取public static String subStr(String str, ...
  •   编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节数截取字符串。但是要保证汉子不被截半个。 分析:   在java语言中,默认使用的unicode编码方式,即每个字符占两个字节,因此可以用来...
  • package 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:14
    java多字节字符串按字节截取算法思路1.先按照实际要截取的字节长度,复制一份字节数组2.转换回字符串,计算字符长度resLen,并按这个长度截取字符串3.计算截取字符串的字节数是否等于需求长度len,相等则直接...
  • Java实现按字节长度截取中英文数字字符串的方法总结用Java实现按字节长度截取中英文数字字符串的方法总结方法一//jdk1.4.2.05Java代码/***@authorcn*@params要截取字符串*@paramlength要截取字符串的长度->...
  • java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。 但对应的字节数不同,一个汉字占两个字节。 定义一个方法,按照最大的字节数来取子串。 如:对于“ab你好”,如果取三个字节,那么子串...
  • 截取字符串时,时候字符串会包含Emoji表情、以及一些特殊符号,用String的substring()进行截取操作,结果就可能是乱码。这是因为JVM运行时使用UTF-16编码,对于普通的字符都是使用char类型存储(2个字节),而...
  • // 去除字符串前后空格?? ?Trim : function(sSubStr){?? ??? ?var lsStr = '';?? ??? ?var StrTrim = document.getElementById(sSubStr);?? ??? ??? ?if(StrTrim!= null){?????????? // lsStr = StrTrim....
  • 编写一个函数,要求输入一个字符串和字节数,输出该字节个数的子字
  • Java截取含有汉字字符串

    千次阅读 2008-11-13 16:43:00
    编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取字符串。但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉...
  • Java编程笔记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) { ...
  • 【Title】[原]Java面试题-将字符串中数字提取出来排序后输出【Date】2013-09-15【Abstract】很简单的面试题,要求现场在纸上写出来。【Keywords】面试、Java、排序【Environment】Windows 7 、 JDK6【Author】wintys...
  • //标记字符串汉字的个数 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++; } ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,426
精华内容 4,170
关键字:

java截取带有汉字的字符串

java 订阅