在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)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. mysql截取函数常用方法 即mysql 字符串 截取-- - 最后带上java字符串截取规则比较

    常用的mysql截取函数有:left(), right(), substring(), substring_index() 下面来一一说明一下: 1.左截取left(str, length) 说明:l ...

  9. java 字符串截取的方法

    1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时. String str = " ...

随机推荐

  1. [转] Maven镜像配置

    参考:许晓斌的<Maven实战> 镜像是为了提供更快的服务 如图:X就认为是Y的一个镜像. 编辑settings.xml配置中央仓库镜像: <settings> ... < ...

  2. C#操作INI配置文件示例

    源文件地址:http://pan.baidu.com/share/link?shareid=2536126078&uk=1761850335创建如图所示的控件: 源代码: using Syst ...

  3. 001-视频 video

    <!DOCTYPE HTML> <html> <body> <video width="320" height="240&quo ...

  4. FineUI属性的简单总结

    .PageManager控件— 页面级别的控制(包括主题.语言 等等) 覆盖web.config中自定义结点的配置 EnablePageLoading:是否启用页面的第一次加载提示,默认居中显示加载图 ...

  5. Mac下Sublime快捷键

    由于自己笔记本是mac,造成window与mac中sublime快捷键不同,现在稍微整理下常用的方便于记忆: 1.control+alt+enter 打开Emmet(Zencoding) 2.supe ...

  6. Js 通过点击改变css样式

    通过js 点击按钮去改变目标原始的背景颜色 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ...

  7. My.Ioc 代码示例——注册项的注销和更新

    当您需要从 Ioc 容器中注销/删除一个注册项的时候,您会怎么做呢? 有人曾经在 stackoverflow 上提问“如何从 Unity 中注销一个注册项”.对于这个问题,有人的回答是“有趣.你为什么 ...

  8. Sublime Text 2 自动开启换行 Word Wrap

    首先当然要夸一下神器 Sublime Text 2,自从第一次用我就彻底把神马 Notepad++ 和 TextMate 打入冷宫,用来开发 WEB 项目从此 IDE 都不需要了! 下面讲讲如何自动开 ...

  9. openssl提取pfx证书密钥对

    刚做银联的项目,对方给了1.pfx和1.cer两个测试文件,总结一下利用这两个文件提取出文本 银联提供两个测试证书  1.pfx 和 1.cer . 其中 pfx证书包含RSA的公钥和密钥;cer证书 ...

  10. ArcGis(01)——地图切片以及发布底图服务

    ArcGis(01)——地图切片以及发布底图服务 环境 操作系统:win10_x64 Gis版本:Arcis server 10.2 准备 1.tif格式地图资源 2.Arcis server 10. ...