在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
你
好
今天就先到这里了。
本文同步分享在 博客“谙忆”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。