Java 截取中英文混合字符串
题目:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
GB2312、GBK、GB18030,CP936以及CNS11643都满足条件 -- 中文是占用2个字节的,英文是占用1一个字节 。
因为中文转换为byte字节,随着编码的不同,转换的字节长度也会不通,如编码为UTF-8,一个中文字符串转换为byte占三个字节.
package com.suanfa;
import java.io.UnsupportedEncodingException;
public class CharactersSplit {
/**
* @param text
* 目标字符串
* @param length
* 截取长度
* @param encode
* 采用的编码方式
* @return
* @throws UnsupportedEncodingException
*/
public static String substring(String text, int length, String encode)
throws UnsupportedEncodingException {
if (text == null) {
return null;
}
StringBuilder sb = new StringBuilder();
int currentLength = 0;
for (char c : text.toCharArray()) {
currentLength += String.valueOf(c).getBytes(encode).length;
if (currentLength <= length) {
sb.append(c);
} else {
break;
}
}
return sb.toString();
}
public static void main(String[] args) throws UnsupportedEncodingException {
String text = "我ABC汉DEF";
int length1 = 3;
int length2 = 6;
String[] encodes = new String[] { "GB2312", "GBK", "GB18030", "CP936",
"CNS11643", "UTF-8" };
for (String encode : encodes) {
System.out.println(new StringBuilder().append("用").append(encode)
.append("编码截取字符串 -- 【").append(text).append("】")
.append(length1).append("个字节的结果是【")
.append(substring(text, length1, encode)).append("】")
.toString());
System.out.println(new StringBuilder().append("用").append(encode)
.append("编码截取字符串 -- 【").append(text).append("】")
.append(length2).append("个字节的结果是【")
.append(substring(text, length2, encode)).append("】")
.toString());
}
}
}
运行后输出:
用GB2312编码截取字符串 -- 【我ABC汉DEF】3个字节的结果是【我A】
用GB2312编码截取字符串 -- 【我ABC汉DEF】6个字节的结果是【我ABC】
用GBK编码截取字符串 -- 【我ABC汉DEF】3个字节的结果是【我A】
用GBK编码截取字符串 -- 【我ABC汉DEF】6个字节的结果是【我ABC】
用GB18030编码截取字符串 -- 【我ABC汉DEF】3个字节的结果是【我A】
用GB18030编码截取字符串 -- 【我ABC汉DEF】6个字节的结果是【我ABC】
用CP936编码截取字符串 -- 【我ABC汉DEF】3个字节的结果是【我A】
用CP936编码截取字符串 -- 【我ABC汉DEF】6个字节的结果是【我ABC】
用CNS11643编码截取字符串 -- 【我ABC汉DEF】3个字节的结果是【我A】
用CNS11643编码截取字符串 -- 【我ABC汉DEF】6个字节的结果是【我ABC】
用UTF-8编码截取字符串 -- 【我ABC汉DEF】3个字节的结果是【我】
用UTF-8编码截取字符串 -- 【我ABC汉DEF】6个字节的结果是【我ABC】
Java 截取中英文混合字符串的更多相关文章
- CSS截取中英文混合字符串长度
<!doctype html> <html> <head> <meta http-equiv="content-type" content ...
- 用JS来实现于截取中英文混合字符串方法(转载)
网站制作过程中,提示层文字超出,需要JS做字符串截取,但是呢,我们常常会烦恼文字中英文混合如何判断,因为我们知道在JS中 string.length这个值是不考虑中英文的,但是计算机对中英文的识别是 ...
- C# 截取中英文混合字符串分行显示宽度相同
/// <summary> /// 截取方法名显示宽度 /// </summary> /// <param name=" ...
- C#截取中英文混合字符串分行显示
private int GetStrByteLength(string str) { return System.Text.Encoding.Default.GetByteCount(str); } ...
- PHP获取中英文混合字符串长度及截取
1.字符串长度 PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改 /** * PHP获取字符串中英文混合长度 * @param $str string 字符串 * ...
- 用C#截取指定长度的中英文混合字符串
很早以前写过一篇文章(用C#截取指定长度的中英文混合字符串),但是对性能没有测试,有人说我写的这个方法性能有问题,后来想,可能真会有BT之需求要求传入一个几万K甚至几M体积的字符串进来,那将会影响正则 ...
- c#的中英文混合字符串截取
public class StringHelper { public static string GetSubString(string str, int len) ...
- c#的中英文混合字符串截取 public static string SubString(string inputString, int byteLength)
/// <summary> /// c#的中英文混合字符串截取(区分中英文) /// </summary> /// <param ...
- c#的中英文混合字符串截取指定长度,startidx从0开始
//c#的中英文混合字符串截取指定长度,startidx从0开始 by gisoracle@126.com public string getStrLenB(string str, int start ...
随机推荐
- RDO Stack: Install newton in the dashboard can't create images
Issue: When you want to create an image in RDO stack newton version, you may encounter following err ...
- 非参数估计:核密度估计KDE
http://blog.csdn.net/pipisorry/article/details/53635895 核密度估计Kernel Density Estimation(KDE)概述 密度估计的问 ...
- vue关于数组使用的坑
关于数组使用的坑 https://vuejs.org/v2/guide/list.html#Caveats 简言之, 不要使用a[i] = v 的形式, 用a.splice(i, 1, v), 或Vu ...
- OpenResty和Resis一些基本的性能配置
Basics: 1. Ensure that you have not disabled Lua code cache: https://github.com/openresty/lua-nginx- ...
- Linux下端口复用(SO_REUSEADDR与SO_REUSEPORT)
freebsd与linux下bind系统调用小结: 只考虑AF_INET的情况(同一端口指ip地址与端口号都相同) freebsd支持SO_REUSEPORT和SO_REUSEADDR选项,而l ...
- Oracle常用语句语法汇总
第一篇 基本操作 --解锁用户 alter user 用户 account unlock; --锁定用户 alter user 用户 account lock; alter user sco ...
- Java异常处理-----抛出处理
抛出处理 定义一个功能,进行除法运算例如(div(int x,int y))如果除数为0,进行处理. 功能内部不想处理,或者处理不了.就抛出使用throw new Exception("除数 ...
- Dynamics CRM 视图显示列的拷贝—view layout replicator
在视图设置的时候很多人会遇到这样的问题,要设置多张视图,而这多张视图可能除了筛选条件不同外其他的均相同,手动去设置是件重复的令人非常头痛的事情,如果能够拷贝那就相当完美了. 本篇即介绍视图显示列的拷贝 ...
- 【Netty源码学习】ServerBootStrap
上一篇博客[Netty源码学习]BootStrap中我们介绍了客户端使用的启动服务,接下来我们介绍一下服务端使用的启动服务. 总体来说ServerBootStrap有两个主要功能: (1)调用父类Ab ...
- ormlite介绍一
概述 ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具. 官方网站:http://ormlite.com ...