`

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按字节截取带有汉字的字符串的解法

    这就意味着当我们按照字节长度截取字符串时,可能会将一个完整的汉字分割成两部分,从而导致乱码。 Java中的`String`类提供了多种截取字符串的方法,如`substring()`、`subSequence()`等,但它们都是基于字符(char...

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

    在 `main` 方法中,我们创建了一个 `SplitString` 对象,并调用其 `SplitIt` 方法来截取字符串。 总结 本例中,我们实现了一个 Java 字符串截取函数,该函数可以截取指定字节的字符串,并保证汉字不被截半个。该...

    根据字节数截取字符串

    本话题将深入探讨如何在Java语言中根据字节数来截取字符串,并结合给出的`SplitString.java`文件,我们可以推测这是一个具体的实现示例。 首先,字符串截取的基本需求是获取字符串的一部分,通常基于特定的起始和...

    JAVA如何按字节截取字符串

    在进行Java编程时,我们经常会遇到需要按字节截取字符串的情况,尤其是在数据传输、网络通信以及对数据进行存储处理的时候。由于计算机内部存储和处理的都是二进制数据,对于非英文字符,在不同的编码(如UTF-8、GBK...

    字符串按照指定的字节数来截取

    了解这些方法后,我们就可以灵活地根据需求截取字符串中的特定字节数部分了。但要注意,字节截取可能会涉及到字符编码问题,因此在实际操作时要特别留意编码格式,避免出现乱码或者截取不完整的情况。

    按byte截取字符串

    总结来说,“按byte截取字符串”是一项实用的技术,涉及到字符串编码、字节数组操作以及对Java语言特性的深入理解。在实际开发中,掌握这项技能对于处理与字节流相关的任务至关重要,尤其是在处理网络数据传输、文件...

    java中截取带汉字的字符串

    2. **计算截取次数**:根据字符串长度和每次截取的字节数,计算出需要截取的次数。如果字符串长度不能被每次截取的字节数整除,则最后一次截取的长度会少于指定的字节数。 3. **实现截取逻辑**:遍历字符串,按照...

    java按字节截取带有汉字的字符串的解法(推荐)

    在Java编程语言中,处理包含汉字的字符串时,由于汉字在不同编码格式下占用的字节数不同,按字节截取字符串会面临特殊挑战。本文将深入探讨如何正确地按字节截取带有汉字的字符串,以确保不出现半字符或者乱码的情况...

    Java精确截取字符串.doc

    面试中可能会遇到类似的问题,要求编写一个函数来截取字符串,确保汉字不被截半。以下是一个简单的示例实现: ```java public class SplitString { private String str; private int byteNum; public ...

    Java 按照字节来截取字符串的代码(不会出现半个汉字)

    本文将详细解析提供的Java代码,了解如何实现按字节截取字符串,确保不出现半个汉字。 首先,给出的代码定义了一个名为`StringTool`的工具类,其中包含一个静态方法`getSubString`,该方法接受一个字符串`str`和一...

    截取如下字符串“java程序教程”的前5个字节,字符串应该为“java程”,截取前6个字符,字符串也应该为“java程”,程序实现之.

    为了实现这一需求,Java提供了String类的getBytes()方法,用于将字符串转换成字节数组,同样也提供了substring()方法用于截取字符串。但在本例中,使用substring()方法无法直接达到目标,因为这种方法无法直接对字节...

    Java精确截取字符串.pdf

    总的来说,Java中精确截取字符串涉及到字符编码、字节长度计算等多个方面。对于不同的场景,需要选择合适的方法,确保截取后的字符串既能满足长度要求,又能正确显示其中的文本内容。在实际开发中,可以根据项目需求...

    字符串 截取

    这意味着如果我们直接按字节来截取字符串,可能会截取到某个汉字的中间部分,从而导致乱码。 #### 2. 截取算法设计 为了实现上述功能,我们需要设计一种算法,使得无论我们指定截取多少字节,都不会截取到半个汉字...

    Java截取中英文混合字符串的方法

    需要注意的是,在截取字符串时,我们必须考虑到编码方式对汉字占用字节长度的影响。这是因为,如果错误地估计了字节长度,就有可能导致汉字被截断,从而引发错误。例如,在某些编码方式下,一个汉字可能由三个字节...

    java 一个截取字符串的函数

    本题中,我们需要编写一个函数,该函数能够根据指定的字节数截取字符串,并确保不会出现汉字被截半的情况。这是一个涉及字符编码和边界条件处理的问题。 首先,我们来理解题目中的要求: 1. 函数接收两个参数,一个...

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

    本文将详细介绍一个用于在Java中根据字节数而非字符数截取字符串的方法——`getLimitLengthString`。该方法能够确保在截断中文字符串时不会出现乱码,并且可以适用于JSP页面中的中文字符串截取需求。 #### 方法实现...

    java中英文字符串截取

    2. **字符与字节的区别**:在讨论字符串长度时,需要区分字符数和字节数。一个字符可能由多个字节组成,尤其是在处理非英文字符时。因此,简单地通过字符串的`length()`方法获取的长度实际上是指字符数,而不是字节...

    java 实现截取字符串并按字节分别输出实例代码

    本例通过Java代码实现了一个截取字符串的函数,该函数能够根据指定的字节数截取字符串,并保证在截取过程中不会将中文字符截断,也就是说,如果一个中文字符的字节长度超过了一个字节,那么在截取时会保持该字符的...

    java中常用的字符串的截取方法

    replace() 方法用于将字符串中所有出现的某个字符或子串替换为另一个字符或子串。例如: String s="Hello"; String newS=s.replace('l', 'w'); // "Hewwo" 15.trim() 方法 trim() 方法用于去掉字符串开始和结尾的...

    impala中substr()截取中文字符串乱码的问题

    当使用`substr()`或`substring()`截取中文字符串时,如果截取的起始位置和长度没有正确地对齐到字符边界,就可能导致部分字符的字节被截断,从而引发乱码。这种问题在其他数据库系统中也常见,尤其是那些不支持...

Global site tag (gtag.js) - Google Analytics