`

Java按字节数截取字符串,一个中文长度为2

    博客分类:
  • Java
阅读更多
碰到可能会截取汉字的情况,当然是要不能截取出乱码来,就是不能对整个汉字截取一半。如"我ABC汉字d"这个字符串,截取5个字节的时候,应该是"我ABC",而截取8个字节的时候,应该是"我ABC汉",而不应该是"我ABC汉?",其中"?"为半个汉字,可理解为向前截取

public static String subStr(String str, int subSLength)  
	           throws UnsupportedEncodingException{ 
	       if (str == null)  
	           return "";  
	       else{ 
	           int tempSubLength = subSLength;//截取字节数
	           String subStr = str.substring(0, str.length()<subSLength ? str.length() : subSLength);//截取的子串  
	           int subStrByetsL = subStr.getBytes("GBK").length;//截取子串的字节长度 
	           //int subStrByetsL = subStr.getBytes().length;//截取子串的字节长度 
	           // 说明截取的字符串中包含有汉字  
	           while (subStrByetsL > tempSubLength){  
	        	   int subSLengthTemp = --subSLength;
	               subStr = str.substring(0, subSLengthTemp>str.length() ? str.length() : subSLengthTemp);  
	               subStrByetsL = subStr.getBytes("GBK").length;
	               //subStrByetsL = subStr.getBytes().length;
	           }  
	           return subStr; 
	       }
	   }


备注:将字符编码GBK改为UTF-8,则每个中文长度按3个字符计算


以下方法是向后截取字符串
public static String subStr_1(String str, int start, int end)
	           throws UnsupportedEncodingException{
		
	    if (str == null)  return null;
	    String chinese = "[\u0391-\uFFE5]";
	    byte[] b = str.getBytes("UTF-8");
	    
	    String temp = new String(b, start, end);
	    String last = getLastStr(temp);
	    while(!last.matches(chinese)){
	    	temp = new String(b, start, ++end);
	    	last = getLastStr(temp);
	    }

        return new String(b, start, end);
	   }


public static String getByteStr(String str, int start, int end) throws UnsupportedEncodingException{
		byte[] b = str.getBytes("UTF-8");
		
		return new String(b, start, end);
	}



以下代码会出现半个汉字问题
/**
 * ReadFileByteBuffer.java
 * cn.com.songjy.test.io
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-8-31    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
*/

package cn.com.songjy.test.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:ReadFileByteBuffer
 *
 * @author   songjy
 * @version  1.0
 * @since    v1.0
 * @Date	 2013-8-31	下午12:15:21
 */

public class ReadFileByteBuffer {

	private static Log log = LogFactory.getLog(ReadFileByteBuffer.class);
	
	public static void main(String[] args) {
		try {
			FileInputStream fis = new FileInputStream("pom.xml");/*创建文件输入流*/
			FileChannel fc = fis.getChannel();
			ByteBuffer bb = ByteBuffer.allocate(64);//每次取出64字节
			/*将FileChannel中的数据放入ByteBuffer*/
			while(-1 != fc.read(bb)){
				bb.flip();/*锁定ByteBuffer的空白区*/
				Charset charset = Charset.forName("UTF-8");/*创建Charset对象*/
				CharsetDecoder decoder = charset.newDecoder();/*创建解码器(CharsetDecoder)对象*/
				CharBuffer cb = decoder.decode(bb);/*将ByteBuffer的内容转码*/
				log.info(cb);
				bb.clear();
			}
		} catch (FileNotFoundException e) {
			log.error(e.getMessage(), e);
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		}
	}

}

/*会出现java.nio.charset.MalformedInputException错误,原因是“半个中文问题”*/
分享到:
评论

相关推荐

    java编写一个截取字符串的函数,输入为一个字符串和字节数.docx

    java编写一个截取字符串的函数,输入为一个字符串和字节数

    字符串 截取

    指定截取字节数,截取字符串,但是不能出现半个汉字的情况,例如: 字符串"喊sd中d王",长度2byte为:喊,长度3byte为:喊s,长度4byte为:喊sd,长度5byte为:喊sd,长度6byte为:喊sd中

    java字节与字符

    IO流 输出、输入字节流,并且任意截取字符串的长度,

    Java算法之对字符串的各种处理(二)

    核心思路:输入一个字符串和字节数,输出按字节数截取字符串, 其中要保证汉字不能被截半个字节,设计思路就是判断汉字占几个字节,通过string.valueof.getBytes()方法获取字符的字节数,之后遍历判断不要超过指定的...

    java 截取字符串(判断汉字)

    jsp截取中文字符串 len为字节长度

    java字符串操作大全

    java字符串操作大全,适合初学者,浅显易懂 部JAVA字符串操作 2008-07-11 15:39:42| 分类: JAVA | 标签: |字号大中小 订阅 . JAVA字符串的方法 String a = "53c015"; //Integer.parseInt(s, radix) radix设置为...

    标题过长使用javascript按字节截取字符串

    做为一个前端开发人员在网页展示中经常会碰到,标题过长,需要截取字符串,用CSS的实现的话各种兼容问题,各种坑。 让后台程序截一下,又各种推托,让后台按字节截一下更是和要了后台老命一样,最后可能只会安字符...

    java面试宝典

    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...

    java范例开发大全源代码

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12 ...

    java范例开发大全

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 ...

    Java范例开发大全 (源程序)

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5...

    Java范例开发大全(全书源程序)

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...

    java范例开发大全(pdf&源码)

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...

    基于Java和Python的爬虫项目实战源码.zip

    Rhino是一个由Java实现的JavaScript语言解析引擎,Rhino的主要功能是管理脚本执行时的运行环境 非HTML解析: PDF文件:PDFBox解析PDF文件 FontBox:处理PDF字体的Java类库 JempBox处理XMP元数据 的Java类库 Office...

    千方百计笔试题大全

    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...

    IO输入输出留

    //将一个文件看做是一个字节数组 //用下标值访问摸个位置的字节值 创建实例 ----------------------- 1 RandomAccessFile raf= new RandomAccessFile(文件,“r”) r 只读模式 1 RandomAccessFile raf= new ...

Global site tag (gtag.js) - Google Analytics