Java---练习(面试题) :字符串截取(1)
在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。
但对应的字节数不同,一个汉字占两个字节。
定义一个方法,按照指定的字节数来取子串。
如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃。如果取四个字节就是“ab你”,取五个字节还是“ab你”。
上面给出的是在gbk编码下的截取字符串。
下面我写了个代码,可以在utf-8和gbk编码下都能截取字符串。
注意:utf-8下的绝大多数汉字都是3个字节,所以,为了简化,全部当成了3个字节处理。
package io.string;
import java.io.IOException;
import java.util.Scanner;
public class StringCutOut {
static final String STR = "汗";
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
// 只考虑GBK和UTF-8
while (true) {
if (STR.getBytes().length % 2 == 0) {// GBK
System.out.println("请输入字符串:(输入'#'结束为结束程序)");
String str = sc.next();
if ("#".equals(str)) {
return;
}
System.out.println("请输入指定字节以用来截取字符串(截取的字符串的字串每个占一行):");
int n = sc.nextInt();
int len = 0;
int m = n;
while (len < str.length()) {
if (str.charAt(len) >= 0 && str.charAt(len) <= 128) {
n--;
System.out.print(str.charAt(len));
if (n <= 0) {
n = m;
System.out.println();
}
len++;
} else {
n -= 2;
System.out.print(str.charAt(len));
if (n <= 0) {
n = m;
System.out.println();
}
len++;
}
}
System.out.println();
} else if (STR.getBytes().length % 2 != 0) {// utf-8
System.out.println("请输入字符串:(输入'#'结束为结束程序)");
String str = sc.next();
if ("#".equals(str)) {
return;
}
str = new String(str.getBytes("gbk"), "UTF-8");
//因为我的终端输入默认是gbk的,改了系统的编码还是没用。所以就用这个转码了。。
//这里肯定是有bug的----留待下次编辑修复
// System.out.println(str);
// System.out.println(str.length());
System.out.println("请输入指定字节以用来截取字符串(截取的字符串的字串每个占一行):");
int n = sc.nextInt();
int len = 0;
int m = n;
while (len < str.length()) {
if (str.charAt(len) >= 0 && str.charAt(len) <= 128) {
n--;
System.out.print(str.charAt(len));
len++;
if (n <= 0) {
n = m;
System.out.println();
}
} else {
if(n-2<=0&&m>=3){
n=m;
System.out.println();
continue;
}
n -= 3;
System.out.print(str.charAt(len));
if(n<=0){
n=m;
System.out.println();
}
len++;
}
}
}
System.out.println();
}
}
}
GBK编码下的一个测试结果:
请输入字符串:(输入'#'结束为结束程序)
ab你好
请输入指定字节以用来截取字符串(截取的字符串的字串每个占一行):
4
ab你
好
UTF-8下的一个测试结果:
请输入字符串:(输入'#'结束为结束程序)
ab你好
请输入指定字节以用来截取字符串(截取的字符串的字串每个占一行):
4
ab
你
好
今天就先到这里了。
Java---练习(面试题) :字符串截取(1)的更多相关文章
- 关于Java和JavaScript对字符串截取处理的总结
在JavaWeb开发中,经常需要对字符串进行处理,包括Java语言和JS语言,总是容易弄混淆,这里简单对比一下两种语言对于字符串截取方法. 一.先看Java public class StringDe ...
- Java中怎样实现字符串截取
使用substring()对字符串进行截取: /** * str.indexOf()查找下标 * substring();//字符串截取 * length();//字符串长度 * */ @Test p ...
- 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中常用的字符串的截取方法
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<字符 ...
- mysql截取函数常用方法 即mysql 字符串 截取-- - 最后带上java字符串截取规则比较
常用的mysql截取函数有:left(), right(), substring(), substring_index() 下面来一一说明一下: 1.左截取left(str, length) 说明:l ...
- java 字符串截取的方法
1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时. String str = " ...
随机推荐
- css.day01.eg
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js星级评分点击星级评论打分效果--收藏--转载
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- AES对称加密算法
package cn.jsonlu.passguard.utils; import org.apache.commons.codec.binary.Base64; import javax.crypt ...
- ASP.NET 日志
ASP.NET5已经内建集成了日志系统,你也可以用第三方的日志框架. 1. 在你的应用程序中实现日志 在Startup.cs文件中,在Configure里可以把ILoggerFactory注入进去,然 ...
- EXT ajax简单实例
转载:http://www.cnblogs.com/xiepeixing/archive/2012/10/24/2736751.html EXT ajax request是ext中对于ajax请求的实 ...
- (转)dedecms插件开发简明教程
这篇文章主要为大家介绍了dedecms插件开发的方法,以实例形式对插件开发的步骤进行了详细的介绍,非常具有实用价值,需要的朋友可以参考下 原文:http://www.jb51.net/cms/230 ...
- Oracle增加自增长列
-- 移除索引drop index TB_1;drop index TB_2 ;alter table TB drop constraint PK_TB; --允许列为空 alter table TB ...
- ios 改变状态栏颜色
http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7 stackoverfl ...
- 【USACO 2.1.5】海明码
[题目描述] 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个 ...
- hdu1142 A Walk Through the Forest( Dijkstra算法+搜索)
看到这道题,想起了我家旁边的山! 那是一座叫做洪山寨的山,据说由当年洪秀全的小妾居住于此而得名! 山上盛产野果(很美味)! 好久没有爬上去了! #include<stdio.h> #inc ...