在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琲琲

Java---练习(面试题) :字符串截取(2-最终版)的更多相关文章

  1. 关于Java和JavaScript对字符串截取处理的总结

    在JavaWeb开发中,经常需要对字符串进行处理,包括Java语言和JS语言,总是容易弄混淆,这里简单对比一下两种语言对于字符串截取方法. 一.先看Java public class StringDe ...

  2. Java中怎样实现字符串截取

    使用substring()对字符串进行截取: /** * str.indexOf()查找下标 * substring();//字符串截取 * length();//字符串长度 * */ @Test p ...

  3. Java面试通关要点 汇总集【最终版】

    本文转载自公众号:服务端思维,阅读大约需要7分钟.梁兄的知识储备很丰富,组织的知识星球里也是干货十足,平常还会有技术研习等活动,欢迎关注. 首先,声明下,以下知识点并非阿里的面试题.这里,笔者结合自己 ...

  4. java 字符串截取的几种方式(转)

    众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的 ...

  5. c#中字符串截取使用的方法

    AndyZhang welcome to java world c#中字符串截取使用的方法 String substring(int beginIndex) String substring(int ...

  6. java 正则匹配空格字符串 正则表达式截取字符串

    java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...

  7. Java---练习(面试题) :字符串截取(1)

    在java中,字符串"abcd"与字符串"ab你好"的长度是一样,都是四个字符. 但对应的字节数不同,一个汉字占两个字节. 定义一个方法,按照指定的字节数来取子 ...

  8. java中常用的字符串的截取方法

    java中常用的字符串的截取方法   1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int l ...

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

    Java中的substring()方法有两个方法的重载,一个带一个参数的,一个带两个参数的. 第一种写法: substring(n);//从索引是n的字符开始截取,条件(n>=0,n<字符 ...

随机推荐

  1. 查看Linux下网卡状态或 是否连接(转)

      1) 通过mii-tool指令       [root@localhost root]# mii-tool        eth0: negotiated 100baseTx-FD, link o ...

  2. GDB调试技巧

    1. 查看内存分布 (gdb) info proc mappings 2. 对于类的调试,先通过行号来设断点, 比如:(gdb) b TcpConnection.cc:63 3. 打印数组的内容 (g ...

  3. Manacher算法求回文半径

    http://wenku.baidu.com/link?url=WFI8QEEfzxng9jGCmWHoKn0JBuHNfhZ-tKTDMux34CeY8UNUwLVPeY5HA3TyoKU2XegX ...

  4. C#截取字符串的方法小结

    1.根据单个分隔字符用split截取 string st="GT123_1"; string[] sArray=st.split("_"); 输出:sArray ...

  5. javascript innerHTML、outerHTML、innerText、outerText的区别

    1.功能讲解: innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 innerText 设置或获取位于对象起始和结束标签内 ...

  6. amCharts 破解

    官网下载 http://www.amcharts.com 然后找到amcharts.js , 打开搜索关键字 “utm_source=swf&utm_medium=demo&utm_c ...

  7. 重新开始学习javase_内部类

    转(http://www.cnblogs.com/dolphin0520/p/3811445.html) 内部类: 在Java 1.1 中,可将一个类定义置入另一个类定义中.这就叫作“内部类”.创建内 ...

  8. 限制窗口拉伸范围——WM_GETMINMAXINFO

    注意:此方法对CListCtrl的Report模式下的表头绘制有影响,用时需注意测试! 使用OnSizing的改进版 该例程用处为将窗口限制了大小,并且只允许上下拉伸.需要注意的是WM_GETMINM ...

  9. NOI 193棋盘分割.cpp

    193:棋盘分割 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分 ...

  10. BroadcastReceiver监听电量变化

    用BroadcastReceiver监听电量的变化,可以实现BroadcastReceiver接收电量变化的广播,然后获取电量百分比信息. BatteryChangedReceiver.java pu ...