编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),两种方法的比较。

Java 按照字节来截取字符串的代码(不会出现半个汉字) Java 按照字节来截取字符串的工具,不会出现半个汉字。一个中文两个字节,一个英文字符只占 1 个字节** 1. 通常我们用于前端显示的时候,防止标题过长 立即下载

黑马基础测试的最后一道题,写代码时费了点儿劲,发现挺有意思的,结合大牛们的宝贵经验,总结了两种方法,端上来与大家分享,热乎的~~~

题目:从“HM程序员训练营”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文。

分析:题目的要求是从字符串中按字节数截取,所以字符串转换为字节数组是肯定的,字母还好说,就占一个字节,问题的关键在于字符串中有汉字的出现,GBK编码中汉字字符是占两个字节的,两个字节分开无法识别,当截取的字节数最后一位是代表半个字符的字节时,运行结果中的字符串末尾会出现“?”以表示最后一个字节无法识别。所以需要在程序中将这种情况回避掉,只显示整个的汉字字符。

第一种方法:通过比较新子串和源字符串相同位置上的字符是否相等来判断新子串中最后一个字节是否可以识别,如果相同则说明最后截取的是一个完整的汉字,如果不同则说明新子串的字节数组最后一个字节是一个汉字的半边,需要舍弃,所以数组指针向左移一位,以保证完整的汉字输出。此方法条理清楚,可阅读性较强。

public static void byteSubStr(String str , int len)
{
String s = null; //初始化字符串s,赋值为空
if(str != null) //传入的字符串不能为空
{
byte[] a = null; //初始化字节数组,赋值为空
try 
{
a = str.getBytes("GBK"); //将字符串转化为字节数组,GBK码表,此时字节数组的长度为14
} 
catch (UnsupportedEncodingException e) //捕捉编码失败异常
{
e.printStackTrace();
}
//System.out.println("String length:"+a.length);打印字节数组的长度
if(a.length <= len)
{
s = str; //如果要求取出的字节长度大于字节数组应有长度,则将s初始化为str
}
else if(len > 0)
{
s = new String(a, 0, len); //如果字节长度在字节数组长度范围内,则根据要求取出长度len,创建新的字符串s。
int length = s.length(); //获取新字符串的长度
//System.out.println(s.length());
if(str.charAt(length - 1) != s.charAt(length-1))//如果原字符串中相应位置上的字符与
//新字符串相应位置上的字符不相等,说明新字符串中相应位置只有半个中文,则应该讲数组指针向左移一位,形成新的子串。
{
if(length < 2)
{
s = null; //如果新字符串的长度小于2,则将新字符串赋值为空。
}

else
{
s = s.substring(0, length - 1); //将符合条件的子串复制给s
}
}
}
}
System.out.println(s);
}


第二种方法:相比较而言,个人觉得第二种方法比较不容易看懂,需要费点儿功夫,首先,在字符串判断的使用使用的是三目运算符,看上去很赞,

接下来在判断新子串是否符合要求时使用了while方法,通过不断的循环比较,数组指针向左移动来获取到最后的字符子串。

public static voidbyteSubStr(String str, int length)
{   
            if (str == null)    
            System.out.println("String is null...");    
            else
           {   
            int len = length; //获取要截取的字节数  
            //System.out.println("len:"+len);
            //System.out.println("strlength:"+str.length());//8

            String s = str.substring(0, str.length() < length ? str.length() : length);  
            //判断如果要截取的字节数长度大于原字符串本身的长度,则仍以原字符串为准,否则获取新子串。规则为包含头不包含尾。
            //System.out.println("s1:"+s);
            int byteLens = 0; //初始化字节数组长度
try 
{
byteLens = s.getBytes("GBK").length; //按照GBK码表将原字符串或子串转为字节数组,并获取字节数组长度。
//System.out.println("byteLens:"+byteLens);

} 
catch (UnsupportedEncodingException e) //捕获编码异常
{
e.printStackTrace();
}      
             while (byteLens > len) //如果字节数组长度大于要截取的字节数,说明有汉语字符的存在
            {    
                int subLength = --length;  
                //System.out.println("subLength:"+subLength);
                s = str.substring(0, subLength > str.length() ? str.length() : subLength); 
                //判断新子串长度和原子串长度,true返回原子串长度,false返回新子串长度
                //System.out.println("s2:"+s);
                try
                {
byteLens = s.getBytes("GBK").length;
//System.out.println("byteLens:"+byteLens);
}
                catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}   
            }    
            System.out.println("String:"+s);   
        }  
 }  



dell r630 配置raid_DELL服务器RAID配置图文教程 名称解释:Disk Group:磁盘组,这里相当于是阵列,例如配置了一个RAID5,就是一个磁盘组VD(Virtual Disk): 虚拟磁盘,虚拟磁盘可以不使用阵列的全部容量,也就是说一个磁盘组可以分为多个VDPD(Physical Disk): 物理磁盘HS:Hot Spare 热备Mgmt:管理【一】创建逻辑磁盘1、按照屏幕下方的虚拟磁盘管理器提示,在VD Mgmt菜单(可以通过CTRL+P... 阅读详情

相关推荐

驱动钛丝(SMA)的应用(5)汽车腰托气阀常见问题及解决方案

财哥在前段时间发布的《驱动钛丝(SMA)的应用(1)汽车腰托支撑按摩气阀模块》一文,引发了很多企业的拜访和交流。 目前很多厂家已经启动或正在进行相关研发,同时也遇到了诸如:钛丝选型、驱动位移、响应设计、温度控制、力量设计、点动滞后、铆接工艺、量化生产等问题。

weixin_39168671的博客 1241

字符的截取方法使用的是Substring 和三目运算符

substring(0,m.title.length>11?11:m.title.length) 转载于:https://www.cnblogs.com/BoYu045535/p/3907866.html

183

保姆级教程:在STM32CubeIDE上快速部署micro_ros到STM32F407(附常见问题解决)

本文提供了一份详细的保姆级教程,指导开发者如何在STM32CubeIDE上快速部署micro_ros到STM32F407微控制器。内容涵盖从Windows与Ubuntu双环境搭建、micro-ROS静态库编译、STM32CubeIDE工程深度集成,到串口通信联调与常见问题解决的完整流程,旨在帮助读者构建稳定可靠的ROS2与嵌入式设备通信系统。

o4p5q6r7s的博客 324

三种截取字符串的方法

第一种: slice - 截取的时候,开始下标和结束下标可以使用负数表示 语法:字符串.slice(开始下标, 结束下标) 注意: 2. 返回被截取出来的字符串,不包含结束下标对应的字符 3. 如果第二个参数省略了,就默认截取到字符串末尾 4. 如果开始下标和结束下标相等 - 截取到空字符串 5. 截取字符串一定是从左向右进行截取的,如果开始下标大于结束下标就截取不到内容了 -1下标就表示最后一个下标 -2下标就表示倒数第二个下标 var str = 'abcdefg' var str

LJDbk的博客 8万+

大白话讲解Numpy中什么是一维、二维、三维数组,以及5种创建方式

NumPy中提供了多种创建数组的方式,其中最基本的方式就是通过array()函数创建数组在使用该函数时直接传入列表或元组即可。 通过array()函数分别创建一维数组、二维组和三维数组,那么什么是维度呢?一维、二维、三维有什么区别? 1、什么是维度? 维度可以理解为描述数据的一种 “方向” 或者 “层次”。在数组中,维度的数量决定了我们需要用多少个索引来访问一个元素 2、一维、二维、三维的区别? (1)一维:一维数组就像是一条直线上排列的一组数据,例如: a = np.array([1, 2

1365

LTspice基础教程-028.Timestep too small

Q: “Timestep too small” error message A: If the LTspice program can’t find a solution for the guessed time step, then the program decreases the time step and tries again. This can’t work forever. If...

gaoyong_wang的博客 2万+

常用字符串截取函数

RTRIM(char,[set]): 从目标字符串char的右端删除set中包含的指定字符;LTRIM(char,[set]):从目标字符串char的左端删除set中包含的指定字符;SUBSTR(str,pos,len):str需要截取的字符串,从pos开始的位置,截取len个字符。[leading|trailing|both]:三个都不出现,即会删除前后字符,默认both。SUBSTR(str,pos): str需要截取的字符串,pos开始的位置,一直截取到最后。搜索开始位置,指向开始搜索的字符串字符;

qq_45763106的博客 2559

S32DS S32K312 LPSPI + DMA配置异步SPI

配置DMA->Specific Configuration->Dma Logic Channel->Configuration->Global。SpiPhyUnitMapping:将该配置Mapping到某一路Spi,此工程配置为Spi1,遂选择LPSPI_1。配置的该路SPI的片选ID,此处ID对应配置Pin脚时lpspi_pcs后的下表(本工程此处为PCS3)配置该路SPI对应的SPI硬件单元ID,本工程配置为Lpspi1,因此配置为CSIB1。首先配置SPI的Pin脚,此处使用的是LPSPI_1。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2363

截取字符串,含有汉字和字母,不能截半个汉字

/** * 2017年6月19日 * * 问题描述: * 编写一个截取字符串的函数,输入为一个字符串和字节数, * 输出为按字节截取的字符串。但是要保证汉字不被截半个, * 如"我ABC"4,应该截为"我AB", * 输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。 * * 问题考察: *

先紳博客 6133

【YOLOv12多模态融合改进】(可见光+红外)涉及像素级融合、特征级融合(中期、中后期、后期)、决策级融合的完整配置步骤以及二次改进方案

在网络输入阶段将多模态数据直接合并,形成统一的特征表示。

Limiiiing的博客 1212

MOSFET雪崩特性参数解析

但是,一些电源在输出短路时,初级中会产生较大的电流,加上初级电感,器件就会有雪崩损坏的可能,因此在这样的应用条件下,就要考虑器件的雪崩能量。对于那些在MOSFET的D和S极产生较大电压的尖峰应用,就要考虑器件的雪崩能量,电压的尖峰所集中的能量主要由电感和电流所决定,因此对于反激的应用,MOSFET关断时会产生较大的电压尖峰。雪崩击穿能量标定了器件可以容忍的瞬时过冲电压的安全值,其依赖于雪崩击穿需要消散的能量。EAS单脉冲雪崩击穿能量, EAS标定了器件可以安全吸收反向雪崩击穿能量的高低。

Airer_00的博客 808

黑马程序员—编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)

------- android培训、java培训、期待与您交流! ---------- package two; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class di10 { public static void main(String

专注的专栏 1386

解决微信小程序长页面滚动到底部点击底部的输入框后输入框漂浮且页面滚动到顶部

一、问题描述 项目中有一个长页面上部展示部分信息下部为信息录入,页面长度为三屏幕(不同手机屏幕大小略有差异),当滚动到第二屏或者第三屏去填写信息时点击输入框后输入框漂浮起来了并且页面向上滚动了一段距离,回到了第一屏中展示的内容。效果如图。 滚动到第二屏,证件号输入。 点击输入框 可以看到证件号输入框漂浮了起来并且页面滚动到了第一屏展示的内容。 注意:小程序是2018年上线,在2020年4月份之前该页面从未出现过这种现象。推测:微信的后续更新中对微信小程序基础库进行了重构,导致点击输入框后页

仰望星空的代码 3260

利用字节数组截取字符串,避免出现半个中文

public class Test01 {/** * 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文 */public static void main(String[] args) {Scanner sc = new Scanner(System.

baidu_35938529的博客 542

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

按照字节截取字符串

按照字节截取字符串?字节和编码到底有什么不可告人的秘密

weixin_44173944的博客 1290

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”...

/*需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。但对应的字节数不同,一个汉字占两个字节。定义一个方法,按照最大的字节数来取子串。如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃。如果去四个字节就是“ab你”,取五个字节还是“ab你”.*/ 代码:其实是一个解码和编码的问题,要明白UTF-8码表和GBK码表...

aodaidi6752的博客 114

GBK与Unicode码表的区别以及decoder和encoder的作用

文章目录GBK与Unicode的区别encoder和decoder的区别实例用途参考链接 GBK与Unicode的区别 讲二者区别之前首先要明白什么是GBK,什么又是Unicode,他们是怎么表示的? GBK和Unicode都是码表,码表的作用就是将一个个的字符与数字对应起来,比如英文字母a所对应的数值是97。 除了这两个常见的码表外,最常见的还有ASCII表,GBK主要用来对汉字和英文字母编码,Unicode不仅可以对汉字编码,还可以对其他语言进行编码,是一个大一统的编码表。从字符编码的范围上讲ASCII

hjyp的博客 4344

【C++】统计字符串中文、英文字母、空格、数字和其他字符的个数 / 判断中文字符(GBK)

写在前面 本文针对GBK编码进行编程,可以右键控制台选择属性查看。 若是UTF-8或其他编码,可以查询相对应的编码表,参考本文思路进行编程。 判断中文字符 首先,我们要知道输入一个中文字符,如果是GBK编码,那么要用两字节进行存储,如果拿string进行存储,那么字符串长度其实为2,s[0]是高字节而s[1]是低字节(此处涉及到内存存储,请参考大小端模式)。 有了前置知识就好办了,我们判断...

微笑丶1998的博客 9420

java按字节截取字符串

需求:oracle有个备注长度只有100,但是不能扩大,只能截取java传输过程中的字符长度 如何知道一个汉字在Oracle数据库中具体占用几个字节? 方式一:这个其实和Oracle的配置是相关的,用以下语句查询当前数据库的字符集: 理论 select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET'; 可以得到如...

一直梦见飞的路人涛 640

Java_编码表

/** * 编码表 *编码表的由来: * 计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识别各个国家的文字。 * 就将各个国家的文字用数字来表示,并一一对应,形成一张表,这就是编码表。 *常见的编码表: * ASCII:美国标准信息交换码,用一个字节的7为可以表示。 * ISO8859-1:拉丁码表。欧洲码表,用一个字节的8位表示。 * GB2312:...

小特 1688

.length()方法返回的是char的数量,而不是字节数

.length()方法返回的是char的数量,而不是字节数

2301_77118121的博客 1122

如何在浏览器中快速处理GBK编码?GBK.js轻量级解决方案完整指南

还在为处理中文GBK编码而烦恼吗?作为前端开发者,你一定遇到过需要处理传统系统API接口、解析GBK编码网页内容或处理包含中文字符的表单提交的场景。JavaScript原生只支持UTF-8和UTF-16编码,对GBK的支持有限,而传统解决方案要么体积庞大,要么性能不佳。今天,我要向你介绍一个终极解决方案——GBK.js,一个专为浏览器设计的轻量级GBK编码库,它能让你在3分钟内搞定所有GBK编码问

gitblog_07437的博客 290

java:关于字符编码的试题

/** 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表) 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文 思路:GBK编码中,一个字母占一个字节,切最高位为0;一个汉字占两个字节,最高位都为为1. */ import java.util.*; class Test10 { ...

wjb214149306的博客 454

24-IO流-70-IO流(练习-按字节截取字符串)

/* * 【练习】 * 在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是4个字符,但对应的字节数不同,一个汉字=2字节,一个字母= * 1字节。 * * 定义一个方法,按照最大的字节数来取字符串。 * * 如:对于“ab你好”,如果取3个字节,那么子串就是ab与“你”字的半个,那么这半个“你”字就要舍弃(因为如果显示是有问题的 * )。如果取4个字节就是“

wy_0928的博客 542

终极指南:如何在浏览器中高效处理GBK中文编码?

作为前端开发者,你是否经常遇到中文乱码问题?特别是在处理传统系统API、解析旧网页内容或处理GBK编码数据时,JavaScript原生的UTF-8支持显得力不从心。GBK.js正是为解决这一痛点而生的轻量级解决方案,它让浏览器也能轻松处理GBK编码,体积小巧、性能卓越,是处理中文编码的强力工具。 ## 为什么前端需要专门的GBK编码库?🤔 ### 中文编码的现实挑战 在中文Web开发中,GB

gitblog_01320的博客 430

STM32之LCD屏GBK字库制作与调用

在开发嵌入式系统时,需要显示不同大小或类型字体的汉字。显然,对于嵌入式系统,不太可能使用矢量字体,在这种情况下,点阵字体就显现出了它的优点。字符编码就是以二进制的数字来对应字符集的字符,目前用得最普遍的字符集是 ANSI,对应 ANSI 字符集的二进制编码就称为 ANSI码,DOS 和 Windows 系统都使用了 ANSI 码,但在系统中使用的字符编码要经过二进制转换,称为系统内码。

weixin_44453694的博客 3234
下一篇: 黑马程序员---交通灯管理系统的总结与改进
西贝呆呆
博客等级 码龄15年 8粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值