`

JAVA按字节截取UTF-8编码的字符串(其他编码也适用)

    博客分类:
  • JAVA
 
阅读更多

代码如下,有更好的意见请留言.

	public static void main(String[] args) throws Exception {
		String encode = "UTF-8";
		// 截取10字节,不出错
		int sublen = 10;
		// UTF-8字节
		String srcStr = "出错出hh错出错hello1出错";
		// 先转化成char
		char[] srcStrChars = srcStr.toCharArray();
		int cnt = 0;
		Charset cs = Charset.forName(encode);
		CharBuffer cb = CharBuffer.allocate(1);
		ByteBuffer resultBuff = ByteBuffer.allocate(sublen);
		for (int i = 0; i < srcStrChars.length; i++) {
			char c = srcStrChars[i];
			cb.put(c);
			cb.flip();
			ByteBuffer bb = cs.encode(cb);
			cnt += bb.array().length;
			if(cnt > sublen){
				break;
			}
			resultBuff.put(bb);
			cb.clear();
		}
		String result = new String(resultBuff.array(), encode);
		System.out.println(result);
	}

 

2
7
分享到:
评论
2 楼 祈祷末日 2015-03-04  
private static final Charset charset = Charset.forName("Shift_JIS");
private static final CharsetEncoder charsetEncoder = charset.newEncoder();
private static String truncTH(String str, int capacity, String csn) throws UnsupportedEncodingException {
if (str.getBytes(charset).length <= capacity)
return str;
CharBuffer in = CharBuffer.wrap(str.toCharArray(), 0, str.length());
charsetEncoder.reset();
charsetEncoder.encode(in, ByteBuffer.allocate(capacity), true);
return in.flip().toString();
}
1 楼 cpfok 2015-01-09  
祈祷末日 写道
private static String cutStringAsUtf8(String inStr) {
int maxLength = 12;
if (StringUtils.isEmpty(inStr)) {
return inStr;
}
Charset utf8 = StandardCharsets.UTF_8;
byte[] binary = inStr.getBytes(utf8);
int size = binary.length;
if (size <= maxLength) {
return inStr;
}
int last = binary[maxLength] & 0xff;
int lastIndex;
if ((last & 0x80) == 0) {
lastIndex = maxLength;
} else {
int foundIndex = -1;
for (int currentIndex = maxLength; currentIndex >= 0; currentIndex--) {
int b = binary[currentIndex] & 0xff;
if ((b & 0xc0) == 0xc0) {
foundIndex = currentIndex;
break;
}
}
if (foundIndex > 0) {
lastIndex = foundIndex;
} else {
throw new IllegalArgumentException("Can't Truncate String");
}
}
return new String(Arrays.copyOf(binary, lastIndex), utf8);
}

这个针对UTF-8字节截取处理的方法很好,我补充点注释这样就能看明白点了.
// 截取位置是单字节判断处理
if ((last & 0x80) == 0) {
lastIndex = maxLength;
} else {
// 截取位置是双字节判断处理
int foundIndex = -1;
// 寻找当前文字,字节开始的位置
for (int currentIndex = maxLength; currentIndex >= 0; currentIndex--) {
int b = binary[currentIndex] & 0xff;
if ((b & 0xc0) == 0xc0) {
foundIndex = currentIndex;
break;
}
}
if (foundIndex > 0) {
lastIndex = foundIndex;
} else {
throw new IllegalArgumentException("Can't Truncate String");
}
}

相关推荐

    关于java按字节截取带有汉字的字符串的解法

    在上述代码中,我们首先将字符串转换为UTF-8编码的字节数组,然后截取所需的字节数量,最后再将截取的字节数组转换回字符串。这种方法可以确保即使在处理汉字时也能正确截取字符串。 需要注意的是,不同编码方式...

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

    它首先计算原始字符串`s`使用UTF-8编码时的字节数`changdu`,如果这个长度大于指定的字节数`num`,则从原始字符串中去掉最后一个字符,然后再次调用`idgui`方法,直到字符串的字节数小于或等于指定的字节数。...

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

    但是,Java的字符串是Unicode的,`getBytes()`会根据指定的字符集编码字符串为字节数组。例如: ```java String str = "你好,世界"; int byteCount = 5; // 指定字节数 byte[] bytes = str.getBytes("UTF-8"); // ...

    字符串截取(按字节)

    本文将深入探讨一种按字节截取字符串的方法,并通过分析一个具体的Java代码示例来解释其实现原理。 #### 核心概念:Unicode与字节 在讨论字符串按字节截取之前,我们首先需要理解几个基础概念。现代计算机系统中,...

    java中截取带汉字的字符串

    这是因为一个中文字符通常占用多个字节(在UTF-8编码下通常是3个字节),而直接按字节数分割可能会在字符中间进行切割,导致数据损坏。 #### 解决方案 为了解决这一问题,我们可以采用一种更为智能的策略来确保...

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

    题目中提到“截取前5个字节, 字符串应该为‘java程’”,意味着我们需要理解,在UTF-8编码格式下,英文字符通常占用1个字节,而中文字符则占用3个字节。因此,实际上,从“java程序教程”中截取前5个字节,得到的...

    按byte截取字符串

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

    根据字节数截取字符串

    由于UTF-8编码的特性,需要额外处理多字节字符,以确保截取的字符串是完整可读的。最后,它使用找到的边界截取字符串并返回结果。 在实际应用中,这种根据字节数截取字符串的方法常用于限制显示长度、发送网络...

    Carmela提供基于PHP,PHP扩展,JAVA,C++等语言的一套处理4四节UTF-8解决方案

    1. **字符串操作函数**:PHP提供了诸如`mb_string`、`iconv`等多字节字符串处理函数,用于正确处理UTF-8编码的字符串,包括拼接、截取、转换等操作。 2. **数据库交互**:在与MySQL、PostgreSQL等支持UTF-8的数据库...

    [待删除]字符串截取 - 中英文

    例如,一个汉字在UTF-8编码下通常占用3个字节,而在GBK编码下则占用2个字节。因此,当在Java程序中处理包含中英文混合的字符串时,必须考虑到编码差异,以避免截取错误或乱码的出现。 ### 实践应用 在实际开发中,...

    字符串 截取

    在UTF-8编码下,一个中文字符通常需要3个字节来表示。这意味着如果我们直接按字节来截取字符串,可能会截取到某个汉字的中间部分,从而导致乱码。 #### 2. 截取算法设计 为了实现上述功能,我们需要设计一种算法,...

    java中英文字符串截取

    例如,在UTF-8编码中,中文字符通常占用3个字节,而在GBK编码中,则可能占用2或4个字节。因此,在计算字符串长度时,必须考虑到实际的编码方式。 2. **字符与字节的区别**:在讨论字符串长度时,需要区分字符数和...

    java字符串处理-中英文-非常有用的

    - **中文字符处理**:由于中文字符在UTF-8编码下通常占用三个字节,但这里为了简化问题,将其视为两个字节进行处理。这种方法虽然不是完全精确,但在大多数情况下能够满足需求。 - **英文字符处理**:英文字符被视为...

    Java精确截取字符串.pdf

    在处理多语言混合的字符串时,可能需要使用UTF-8等其他编码方式,同时考虑到不同语言字符的字节长度差异。此外,还可以使用Java的`Character`类的`isHighSurrogate()`和`isLowSurrogate()`方法来处理Unicode字符,以...

    java 字符串截取的实例详解

    在 Java 中,字符串截取可以通过多种方式实现,本文将介绍 Java 字符串截取的实例详解,包括GBK和utf-8编码下的字符串截取。 一、字符串截取的实例详解 在 Java 中,字符串截取可以通过使用substring()方法实现,...

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

    这是因为这两个函数在设计时可能没有充分考虑多字节字符集,如UTF-8,而中文字符在UTF-8编码下通常由多个字节组成。 当使用`substr()`或`substring()`截取中文字符串时,如果截取的起始位置和长度没有正确地对齐到...

    统计字符串中英文标点数量并截取.zip

    GBK编码一个中文字符通常占用2个字节,而UTF-8编码下,中文字符一般占用3个字节,英文和数字字符通常只占1个字节。因此,在计算总长度时,需要根据字符串的实际编码方式来进行字节数的累加。 在数据库操作中,字段...

    字符串截取

    - **字符串编码**:用于表示文本的计算机编码格式,常见的有 ASCII、UTF-8、GBK 等。 - **jQuery**:一种常用的 JavaScript 库,可以简化 HTML 文档遍历、事件处理、动画以及 Ajax 交互等操作。 #### 三、实现原理 ...

    Java截取(提取)子字符串(substring()).pdf

    因此,如果你的字符串包含多字节字符(比如UTF-8编码的非ASCII字符),截取时仍然按照字符边界来划分,而不是字节。 下面是一个使用`substring()`方法的示例代码: ```java public static void main(String[] args...

    高阶JAVA篇-深入解读字符集.pptx.pptx

    在Java中,字符编码涉及了多种类型,如ASCII、ISO-8859-1和UTF-8等。 ASCII是最基础的7位字符编码,它只包含128个基本的拉丁字母、数字和符号。而ISO-8859-1是扩展的8位字符集,包含了更多的西欧语言字符。UTF-8则...

Global site tag (gtag.js) - Google Analytics