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 = " ...
随机推荐
- iOS开发系列之运动事件
前面我们主要介绍了触摸事件以及由触摸事件引出的手势识别,下面我们简单介绍一下运动事件.在iOS中和运动相关的有三个事件:开始运动.结束运动.取消运动. 监听运动事件对于UI控件有个前提就是监听对象必须 ...
- Android(java)学习笔记235:多媒体之计算机图形表示方式
1.多媒体 很多媒体:文字(TextView,简单不讲),图片,声音,视频等等. 2.图片 计算机如何表示图片的? (1)bmp 高质量保存 256色位图:图片中的每个像素点可以有256种颜 ...
- “死锁” 与 python多线程之threading模块下的锁机制
一:死锁 在死锁之前需要先了解的概念是“可抢占资源”与“不可抢占资源”[此处的资源可以是硬件设备也可以是一组信息],因为死锁是与不可抢占资源有关的. 可抢占资源:可以从拥有他的进程中抢占而不会发生副作 ...
- 移动页面缩放方法之(三)rem布局
<!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta http-equiv="Con ...
- http2.0
HTTP2.0性能增强的核心:二进制分帧 HTTP 2.0最大的特点: 不会改动HTTP 的语义,HTTP 方法.状态码.URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能 ...
- Linux基本权限
首先需要我们了解的是,权限(rwx)对于文件和目录的作用是不一样的 . 权限对文件的作用 r : 读取文件内容(cat , more , head , tail) w: 编辑.新增.修改文件内容(vi ...
- How JSP work.
A JSP page exists in three forms: JSP source code: consists of a mix of HTML template code. Java lan ...
- struts2与spring集成时,关于class属性及成员bean自动注入的问题
http://blog.csdn.net/sun_zhicheng/article/details/24232129
- Swift - 07 - 布尔类型
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- java_log_01
logback&slf4j(本文中的版本为logback1.1.7.slf4j1.7.21),参照 原作者:Ceki Gülcü.Sébastien Pennec中文版译者:陈华联系方式:cl ...