Java(面试题):字符串截取

Java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。 
但对应的字节数不同,一个汉字占两个字节。 
定义一个方法,按照指定的字节数来取子串。 
如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃。如果取四个字节就是“ab你”,取五个字节还是“ab你”。

上面给出的是在gbk编码下的截取字符串。 
下面我写了个代码,可以在utf-8和gbk编码下都能截取字符串。

注意:utf-8下的绝大多数汉字都是3个字节,所以,为了简化,全部当成了3个字节处理。

注意: 
在上一个中,我把题意理解错了,其实题目要求的只是输出第一个n字节的字串就可以了。 
在上一个中我是把一个字符串按照n拆分了。。。。

package io.app;

import java.io.IOException;

import org.junit.Test;

/**
 *
 * @author 陈浩翔
 *
 * @version 1.0  2016-4-28
 */
public class StringCut {

    public static void main(String[] args) {

        String str = "ab你好a琲琲";
        byte bf[] = str.getBytes();//这里是采用默认编码,可能是GBK,也可能是UTF-8
        for(int i=0;i<=bf.length;i++){
            String res;
            try {
                res = cutString(str,i);
                System.out.println(i+" : "+res);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

    /**
     * 根据传入的字符串,来判断是什么编码的,分别导向不同的方法
     * @param str
     * @param len
     * @return
     * @throws IOException
     */
    private static String cutString(String str, int len) throws IOException {
        //System.getProperty("file.encoding")---获得系统的编码
        if(System.getProperty("file.encoding").equalsIgnoreCase("gbk")){
            return cutStringGbk(str, len);
        }
        if(System.getProperty("file.encoding").equalsIgnoreCase("utf-8")){
            return cutStringUtf8(str, len);
        }
        throw new RuntimeException("不支持当前系统的编码");
    }

    private static String cutStringUtf8(String str, int len) throws IOException {
        byte buf[] = str.getBytes("utf-8");
        int count=0;
        for(int i=len-1;i>=0;i--){
            if(buf[i]<0){
                count++;
            }else{
                break;
            }
        }
        int x = count%3;
        return new String(buf,0,len-x,"utf-8");
    }

    private static String cutStringGbk(String str, int len) throws IOException {
        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");
        }
    }

    @Test
    /**
     * 可以不需要main方法进行运行单个方法!!!!
     * @throws IOException
     */
    public void analyze() throws IOException {
        //String str ="ab你好";
        String str ="ab你好a琲琲琲";
        //byte buf[] = str.getBytes("gbk");
        byte buf[] = str.getBytes("utf-8");
        for(byte b:buf){
            System.out.print(b+" ");
        }
        System.out.println();
    }

}

GBK下的运行结果: 
(汉字为2个字节)

0 :
1 : a
2 : ab
3 : ab
4 : ab你
5 : ab你
6 : ab你好
7 : ab你好a
8 : ab你好a
9 : ab你好a琲
10 : ab你好a琲
11 : ab你好a琲琲

UTF-8下的运行结果: 
(汉字理解为3个字节)

0 :
1 : a
2 : ab
3 : ab
4 : ab
5 : ab你
6 : ab你
7 : ab你
8 : ab你好
9 : ab你好a
10 : ab你好a
11 : ab你好a
12 : ab你好a琲
13 : ab你好a琲
14 : ab你好a琲
15 : ab你好a琲琲
时间: 2024-12-17 05:07:11

Java(面试题):字符串截取的相关文章

js字符串截取为数组

var str="hello,word,java,eclipse,jsp"; //字符串截取为数组 var strArr=str.split(","); for(j = 0,len=strArr.length; j < len; j++) { alert(strArr[j]); }; 原文地址:https://www.cnblogs.com/cppdy/p/9886538.html

ACM试题 - 括号配对问题 - Java中字符串截取和定位问题

ACM试题题源(括号配对问题):http://acm.nyist.net/JudgeOnline/problem.php?pid=2 提交代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); String[] ans = new String[n];

java面试题,将String字符串转换成数字

题目要求:将String字符串转换成数字,不能用java自带的方法转换字符串,要求自己写一个atoi(String s),如果输入的不是数字则返回0. import java.util.Scanner; /** * Created by Dell on 2014/7/14. * * 面试题 * 将字符串转换成数字,不用java自带的方法 */ public class MianShi_01 { public static void main(String[] args) { Scanner in

Java按照字节来截取字符串的工具,不会出现半个汉字

原文:Java按照字节来截取字符串的工具,不会出现半个汉字 源代码下载地址:http://www.zuidaima.com/share/1550463396842496.htm Java 按照字节来截取字符串的工具,不会出现半个汉字.一个中文两个字节,一个英文字符只占 1 个字节 1. 通常我们用于前端显示的时候,防止标题过长.... /* * Copyright 2012-2013 The Haohui Network Corporation */ package com.haohui.com

java中文字符串截取

/** * author geksong <br/> * function 中文字符串相关操作<br/> **/ public class ChinaStringUtil { /** * 判断字符是不是中文字符 * @param c * @return */ public static boolean isChinese(char c) { int ascii = (int)c; if(ascii >= 0 && ascii <= 255) return

[java面试题]最长的回文字符串中出现确定

<span style="font-family: Arial, Helvetica, sans-serif;">package com.wzw.util;</span> import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; public class HuiWen { public static void main(String[] args) thr

java 字符串截取 - 最后带上mysql字符串截取比较

Java中的substring()方法有两个方法的重载,一个带一个参数的,一个带两个参数的. 第一种写法: substring(n);//从索引是n的字符开始截取,条件(n>=0,n<字符串长度),第一个字符的索引是0 .n作为第一个参数,必须小于字符串长度,因为这边是从包含n下边开始截取的,所以n肯定不能等于字符串整个位数长度,而下边的m作为第二个参数才可以等于. 第二种写法: substring(n,m);//从n开始,截取m-n个字符,条件(n<m,m<=字符串长度) 通俗点

java 字符串截取的几种方式

1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时. String str = "abc,12,3yy98,0"; String[] strs=str.split(","); for(int i=0,len=strs.length;i<len;i++){ System.out.println(strs[i].toString()); } 1 2 3 4

java 字符串截取的三种方法

1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时. String str = "abc,12,3yy98,0"; String[] strs=str.split(","); for(int i=0,len=strs.length;i<len;i++){ System.out.println(strs[i].toString()); } 运行结果: ab