java按指定的字节Byte的起始位置截取长度截取字符串_byte截取长度_Mario♔的博客-程序员宅基地

技术标签: java  Byte  String  

java按指定的字节Byte的起始位置截取长度截取字符串,自动舍弃超出字节长度的汉字

package com.avic.common.utils;

import java.io.UnsupportedEncodingException;

/**
 * @author Administrator
 *
 */
public class StringSubUtils {

	/**
	 * 判断是否是一个中文汉字
	 * 
	 * @param c
	 *            字符
	 * @return true表示是中文汉字,false表示是英文字母
	 * @throws UnsupportedEncodingException
	 *             使用了JAVA不支持的编码格式
	 */
	public static boolean isChineseChar(char c) throws UnsupportedEncodingException {

		// 如果字节数大于1,是汉字
		// 以这种方式区别英文字母和中文汉字并不是十分严谨,但在这个题目中,这样判断已经足够了
		return String.valueOf(c).getBytes("utf-8").length > 1;
	}

	/**
	 * 计算当前String字符串所占的总Byte长度
	 * 
	 * @param args
	 *            要截取的字符串
	 * @return 返回值int型,字符串所占的字节长度,如果args为空或者“”则返回0
	 * @throws UnsupportedEncodingException
	 */
	public static int getStringByteLenths(String args) throws UnsupportedEncodingException {
		return args != null && args != "" ? args.getBytes("utf-8").length : 0;
	}

	/**
	 * 获取与字符串每一个char对应的字节长度数组
	 * 
	 * @param args
	 *            要计算的目标字符串
	 * @return int[] 数组类型,返回与字符串每一个char对应的字节长度数组
	 * @throws UnsupportedEncodingException
	 */
	public static int[] getByteLenArrays(String args) throws UnsupportedEncodingException {
		char[] strlen = args.toCharArray();
		int[] charlen = new int[strlen.length];
		for (int i = 0; i < strlen.length; i++) {
			charlen[i] = String.valueOf(strlen[i]).getBytes("utf-8").length;
		}
		return charlen;
	}

	/**
	 * 按字节截取字符串 ,指定截取起始字节位置与截取字节长度
	 * 
	 * @param orignal
	 *            要截取的字符串
	 * @param offset
	 *            截取Byte长度;
	 * @return 截取后的字符串
	 * @throws UnsupportedEncodingException
	 *             使用了JAVA不支持的编码格式
	 */
	public static String substringByte(String orignal, int start, int count) {

		// 如果目标字符串为空,则直接返回,不进入截取逻辑;
		if (orignal == null || "".equals(orignal))
			return orignal;

		// 截取Byte长度必须>0
		if (count <= 0)
			return orignal;

		// 截取的起始字节数必须比
		if (start < 0)
			start = 0;

		// 目标char Pull buff缓存区间;
		StringBuffer buff = new StringBuffer();

		try {

			// 截取字节起始字节位置大于目标String的Byte的length则返回空值
			if (start >= getStringByteLenths(orignal))
				return null;

			// int[] arrlen=getByteLenArrays(orignal);
			int len = 0;

			char c;

			// 遍历String的每一个Char字符,计算当前总长度
			// 如果到当前Char的的字节长度大于要截取的字符总长度,则跳出循环返回截取的字符串。
			for (int i = 0; i < orignal.toCharArray().length; i++) {

				c = orignal.charAt(i);

				// 当起始位置为0时候
				if (start == 0) {

					len += String.valueOf(c).getBytes("utf-8").length;
					if (len <= count)
						buff.append(c);
					else
						break;

				} else {

					// 截取字符串从非0位置开始
					len += String.valueOf(c).getBytes("utf-8").length;
					if (len >= start && len <= start + count) {
						buff.append(c);
					}
					if (len > start + count)
						break;

				}
			}

		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		// 返回最终截取的字符结果;
		// 创建String对象,传入目标char Buff对象
		return new String(buff);
	}

	/**
	 * 截取指定长度字符串
	 * 
	 * @param orignal
	 *            要截取的目标字符串
	 * @param count
	 *            指定截取长度
	 * @return 返回截取后的字符串
	 */
	public static String substringByte(String orignal, int count) {
		return substringByte(orignal, 0, count);
	}

	public static void main(String[] args) {
		// 原始字符串
		String s = "测试字符串长度按照字节长度截取字符串";

		System.out.println("原始字符串:" + s);

		try {
			System.out.println("原始字符串字节长度:" + s.getBytes("utf-8").length);
			System.out.println("截取前6位:" + StringSubUtils.substringByte(s, 6));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

	}

}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/semial/article/details/83789233

智能推荐

layui页面的自动上下滚动_layui 滚动条_请问你是水呢的博客-程序员宅基地

核心代码 /* 滚动条自动上下滚动 */ scrollBar(); function scrollBar() { var height = $('.layui-table-body').height(); var number = 0; var length = 0; var time = setInter

词汇课程——词的颜色与易混淆的词缀(4)_AI让世界更懂你的博客-程序员宅基地

文章目录1.回顾2. 褒义词和贬义词(以胖瘦为例)2.1 胖的2.2匀称的2.2 瘦的3. 形容词兄弟4. but的双重否定5. 新词构词法6. 容易混淆的形容词和副词7. 同音不同义8 数字前缀接下来,我们将要继续学习大约130个单词,一起来吧!1.回顾在之前的一讲中,我们主要学习了以义项为基础的多义词解释问题,事实上,多义词都是以核心的意思为基础,在不同的上下文中的不同解读而已。下面我们...

【Java基础】· 常用类习题详解_java关于类的编程题_麟-小白的博客-程序员宅基地

Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!!!如果小哥哥小姐姐们对我的文章感兴趣,请不要吝啬你们的小手,多多呀!爱你们!!!目录【往期回顾】判断输出结果String str1 = "尚硅谷";String str2 = "尚硅谷";String str3 = new String("尚硅谷");//true。

计算机取证volatility_R0be1l的博客-程序员宅基地

带有恶意软件的内存镜像下载:https://github.com/volatilityfoundation/volatility/wiki/Memory-SamplesDumpIt v1.3.2:https://qpdownload.com/dumpit/一、volatility v2.61.使用内存镜像转储工具dumpit生成内存镜像文件(.raw)或者使用虚拟机快照文件(.vmem...

Django 中数据库的相关操作_zero.....的博客-程序员宅基地

本节内容路由系统 models模型 admin views视图 template模板引子讲django的models之前, 先来想一想, 让你通过django操作数据库,你怎么做? 做苦思冥想,可能会这样写。 1 2 3 4 5 6 7 8 9 10 11 12...

随便推点

List集合去重的三种方法_乌梅子酱~的博客-程序员宅基地

在实际开发的时候,我们经常会碰到这么一个困难:一个集合容器里面有很多重复的对象,里面的对象没有主键,但是根据业务的需求,实际上我们需要根据条件筛选出没有重复的对象。比较暴力的方法,就是根据业务需求,通过两层循环来进行判断,没有重复的元素就加入到新集合中,新集合中已经有的元素就跳过。操作例子如下,创建一个实体对象PenBean,代码如下:/***笔实体*/publicclassPenBean{/**类型*/privateStringtype;...

ajax的使用 json格式传参_ajax json传参_xiuxiu--的博客-程序员宅基地

json格式被认为进行ajax前后端交互比较方便,这里就贴上前端js的相关代码 //首先绑定一个按钮,被点击时触发ajax方法 $("#sendEmail-btn").on("click", function () { $.ajax({ type: 'post',//请求类型为post //关键:传过去的内容为{key: value}对,即为json格式,关系到能否正确传参 data: { email: $("#email-input").

Logistic回归总结_叶落无痕0826的博客-程序员宅基地

【机器学习笔记1】Logistic回归总结 http://blog.csdn.net/dongtingzhizi/article/details/15962797 【机器学习笔记2】Linear Regression总结http://blog.csdn.net/dongtingzhizi/article/details/16884215

极限思想在计算机中的应用,高等数学中极限思想的应用_解说柯基的博客-程序员宅基地

摘 要: 本文通过系统阐述极限理论在数学理论发展中的重要作用,说明了在高等数学教学中加强极限思想教学的必要性.关键词: 高等数学 极限 极限思想极限是高等数学中的一个非常重要的概念,极限思想贯穿于高等数学的各个部分.因此,理解极限概念所蕴涵的数学思想方法,对掌握高等数学中的其他概念有很大的帮助.纵观数学的发展史,当初牛顿、莱布尼兹在创立微积分时取得了极其重要的创造性的成果,但由于缺乏清晰严格的“极...

C#word(2007)操作类--新建文档、添加页眉页脚、设置格式、添加文本和超链接、添加图片、表格处理、文档格式转化_microsoft.office.interop.word 设置页眉_yizhi鬼的博客-程序员宅基地

using System;using System.Collections.Generic;using System.Text;using System.IO;using Microsoft.Win32;using Microsoft.Office.Interop.Word;using System.Net;using System.Web;using System

推荐文章

热门文章

相关标签