Java---练习(面试题) :字符串截取(2-最终版)

举报
谙忆 发表于 2021/05/28 08:00:15 2021/05/28
【摘要】 在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。 但对应的字节数不同,一个汉字占两个字节。 定义一个方法,按照指定的字节数来取子串。 如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃。如果取四个字节就是“ab你”,取五个字节还是“ab你”。 上面给出的是在gbk编码下的截取字符串。 下面我...

在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(); }


}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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你好a13 : ab你好a14 : ab你好a15 : ab你好a琲琲

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

文章来源: chenhx.blog.csdn.net,作者:谙忆,版权归原作者所有,如需转载,请联系作者。

原文链接:chenhx.blog.csdn.net/article/details/51273721

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。