Java---练习(面试题) :字符串截取(2-最终版)
在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-最终版)的更多相关文章
- 关于Java和JavaScript对字符串截取处理的总结
在JavaWeb开发中,经常需要对字符串进行处理,包括Java语言和JS语言,总是容易弄混淆,这里简单对比一下两种语言对于字符串截取方法. 一.先看Java public class StringDe ...
- Java中怎样实现字符串截取
使用substring()对字符串进行截取: /** * str.indexOf()查找下标 * substring();//字符串截取 * length();//字符串长度 * */ @Test p ...
- Java面试通关要点 汇总集【最终版】
本文转载自公众号:服务端思维,阅读大约需要7分钟.梁兄的知识储备很丰富,组织的知识星球里也是干货十足,平常还会有技术研习等活动,欢迎关注. 首先,声明下,以下知识点并非阿里的面试题.这里,笔者结合自己 ...
- java 字符串截取的几种方式(转)
众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的 ...
- c#中字符串截取使用的方法
AndyZhang welcome to java world c#中字符串截取使用的方法 String substring(int beginIndex) String substring(int ...
- java 正则匹配空格字符串 正则表达式截取字符串
java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...
- Java---练习(面试题) :字符串截取(1)
在java中,字符串"abcd"与字符串"ab你好"的长度是一样,都是四个字符. 但对应的字节数不同,一个汉字占两个字节. 定义一个方法,按照指定的字节数来取子 ...
- java中常用的字符串的截取方法
java中常用的字符串的截取方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int l ...
- java 字符串截取 - 最后带上mysql字符串截取比较
Java中的substring()方法有两个方法的重载,一个带一个参数的,一个带两个参数的. 第一种写法: substring(n);//从索引是n的字符开始截取,条件(n>=0,n<字符 ...
随机推荐
- QT程序库
实际上,QT不仅仅是一个巨大的程序库,而是7个程序库,还包括许多使用工具,qmake是其中的一个.如今,术语GUI工具包代表的东西的用途不再仅仅是系统提供的那么一个小部分(GUI界面).尤其是QT ...
- 百度地图api之如何自定义标注图标
在百度地图api中,默认的地图图标是一个红色的椭圆形.但是在项目中常常要求我们建立自己的图标,类似于我的这个 操作很简单,分如下几步进行 步骤一:先ps一个图标,大小要合适,如果要背景透明的,记得保存 ...
- SPOJ 3048 - DNA Sequences LCS
给出两个字符串(不长于1000),求最长公共子序列,要求:从每个串中取必须取连续k (1<=k<=100)个数 [LCS]一开始自己想用DP加一维[len]用来表示当前已经取了连续len个 ...
- FineUI属性的简单总结
.PageManager控件— 页面级别的控制(包括主题.语言 等等) 覆盖web.config中自定义结点的配置 EnablePageLoading:是否启用页面的第一次加载提示,默认居中显示加载图 ...
- GIT学习(一)-->Git产生的历史原因
首先要说:Git是目前世界上最先进的分布式版本控制系统(没有之一). git的作者:Linus,林纳斯(下图就是,先膜拜一下,因为成就可不止这一点) 他是为何要写git的呢?话说 Linus虽然创建了 ...
- PHP 实现ajax的接收
Ajax界面: 首先,理解本质,就是普通的一个提交在无刷新的情况下发出请求后得到响应,然后去针对你需要 的情况来做行为. <!DOCTYPE html> <html> < ...
- MVC部署出现HTTP 404 错误
asp.net mvc部署出现问题,http错误404.0,报错如下图: 在网上找了好多方法都不行.最后我的解决方案是: 打好这个补丁就行了http://support.microsoft.com/k ...
- 新修改了EMA的计算方法,合并线性回归率的计算。和通达信的结果一模一样
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- js单条新闻向上滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- Knockoutjs官网翻译系列(一)
最近马上要开始一个新项目的研发,作为第一次mvvm应用的尝试,我决定使用knockoutjs框架.作为学习的开始就从官网的Document翻译开始吧,这样会增加印象并加入自己的思考,说是翻译也并不是纯 ...