`

按字节截取含有中文汉字的字符串

 
阅读更多

要求实现一个按字节截取字符串的方法,比如对于字符串"我ZWR爱JAVA",截取它的前四位字节应该是"我

ZW",而不是"我ZWR",同时要保证不会出现截取了半个汉字的情况。

英文字母和中文汉字在不同的编码格式下,所占用的字节数也是不同的,我们可以通过下面的例子来看看在一

些常见的编码格式下,一个英文字母和一个中文汉字分别占用多少字节。

 

package com.cmb.fmserver.business.direct.bankfront;

import java.io.UnsupportedEncodingException;

public class EncodeTest {
	/** 
	* 打印字符串在指定编码下的字节数和编码名称到控制台 
	* 
	* @param s 
	* 字符串 
	* @param encodingName 
	* 编码格式 
	*/
	public static void printByteLength(String s, String encodingName) {
		System.out.print("字节数:");
		try {
			//如果你的EncodeTest类使用其他编码方式,替换这里的gbk为你的文件编码方式。
			String ss = new String(s.getBytes("gbk"),encodingName);
			System.out.print(ss.getBytes(encodingName).length);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println(";编码:" + encodingName);
	}

	public static void main(String[] args) {
		String en = "A";
		String ch = "人";
		// 计算一个英文字母在各种编码下的字节数  
		System.out.println("英文字母:" + en);
		EncodeTest.printByteLength(en, "GB2312");
		EncodeTest.printByteLength(en, "GBK");
		EncodeTest.printByteLength(en, "GB18030");
		EncodeTest.printByteLength(en, "ISO-8859-1");
		EncodeTest.printByteLength(en, "UTF-8");
		EncodeTest.printByteLength(en, "UTF-16");
		EncodeTest.printByteLength(en, "UTF-16BE");
		EncodeTest.printByteLength(en, "UTF-16LE");
		System.out.println();
		// 计算一个中文汉字在各种编码下的字节数  
		System.out.println("中文汉字:" + ch);
		EncodeTest.printByteLength(ch, "GB2312");
		EncodeTest.printByteLength(ch, "GBK");
		EncodeTest.printByteLength(ch, "GB18030");
		EncodeTest.printByteLength(ch, "ISO-8859-1");
		EncodeTest.printByteLength(ch, "UTF-8");
		EncodeTest.printByteLength(ch, "UTF-16");
		EncodeTest.printByteLength(ch, "UTF-16BE");
		EncodeTest.printByteLength(ch, "UTF-16LE");
	}
}

 

 


 运行结果如下:

 

英文字母:A

字节数:1;编码:GB2312

字节数:1;编码:GBK

字节数:1;编码:GB18030

字节数:1;编码:ISO-8859-1

字节数:1;编码:UTF-8

字节数:4;编码:UTF-16

字节数:2;编码:UTF-16BE

字节数:2;编码:UTF-16LE

 

中文汉字:人

字节数:2;编码:GB2312

字节数:2;编码:GBK

字节数:2;编码:GB18030

字节数:2;编码:ISO-8859-1

字节数:6;编码:UTF-8

字节数:4;编码:UTF-16

字节数:2;编码:UTF-16BE

字节数:2;编码:UTF-16LE

 

 

UTF-16BE和UTF-16LE是UNICODE编码家族的两个成员。UNICODE标准定义了UTF-8、UTF-16、UTF-32三

种编码格式,共有UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE七种编码方

案。JAVA所采用的编码方案是UTF-16BE。从上例的运行结果中我们可以看出,GB2312、GBK、GB18030三

种编码格式都可以满足题目的要求。下面我们就以GBK编码为例来进行解答。

如果我们直接按照字节截取会出现什么情况呢?我们来测试一下:

public class CutString {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "我ZWR爱JAVA";
// 获取GBK编码下的字节数据
byte[] data = s.getBytes("GBK");
byte[] tmp = new byte[6];
// 将data数组的前六个字节拷贝到tmp数组中
System.arraycopy(data, 0, tmp, 0, 6);
// 将截取到的前六个字节以字符串形式输出到控制台
s = new String(tmp);
System.out.println(s);

}
}

 输出结果:

1. 我ZWR?

 在截取前六个字节时,第二个汉字“爱”被截取了一半,导致它无法正常显示了,这样显然是有问题的。

我们不能直接使用String类的substring(int beginIndex, int endIndex)方法,因为它是按字符截取

的。'我'和'Z'都被作为一个字符来看待,length都是1。实际上我们只要能区分开中文汉字和英文字母,这个问

题就迎刃而解了,而它们的区别就是,中文汉字是两个字节,英文字母是一个字节。

 

public class CutString {
/**
* 判断是否是一个中文汉字
*
* @param c
* 字符
* @return true表示是中文汉字,false表示是英文字母
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static boolean isChineseChar(char c)
throws UnsupportedEncodingException {
// 如果字节数大于1,是汉字
// 以这种方式区别英文字母和中文汉字并不是十分严谨,但在这个题目中,这样判断已经足够了
return String.valueOf(c).getBytes("GBK").length > 1;
}
/**
* 按字节截取字符串
*
* @param orignal

* 原始字符串
* @param count
* 截取位数
* @return 截取后的字符串
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static String substring(String orignal, int count)
throws UnsupportedEncodingException {
// 原始字符不为null,也不是空字符串
if (orignal != null && !"".equals(orignal)) {
// 将原始字符串转换为GBK编码格式
orignal = new String(orignal.getBytes(), "GBK");
// 要截取的字节数大于0,且小于原始字符串的字节数
if (count > 0 && count < orignal.getBytes("GBK").length) {
StringBuffer buff = new StringBuffer();
char c;
for (int i = 0; i < count; i++) {
// charAt(int index)也是按照字符来分解字符串的
c = orignal.charAt(i);
buff.append(c);
if (CutString.isChineseChar(c)) {
// 遇到中文汉字,截取字节总数减1
--count;
}
}
return buff.toString();
}
}
return orignal;
}
public static void main(String[] args) {
// 原始字符串
String s = "我ZWR爱JAVA";
System.out.println("原始字符串:" + s);
try {
System.out.println("截取前1位:" + CutString.substring(s, 1));
System.out.println("截取前2位:" + CutString.substring(s, 2));
System.out.println("截取前4位:" + CutString.substring(s, 4));
System.out.println("截取前6位:" + CutString.substring(s, 6));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}

 运行结果:

1. 原始字符串:我ZWR爱JAVA

2. 截取前1位:我

3. 截取前2位:我

4. 截取前4位:我ZW

5. 截取前6位:我ZWR爱

分享到:
评论

相关推荐

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

    总的来说,处理带有汉字的字符串时,按照字节截取需要考虑字符编码,以避免破坏字符完整性。通过自定义方法并结合Java的字符编码功能,我们可以有效地解决这个问题。在实际开发中,理解字符编码和字节流的概念对于...

    中英文字符串按字节截取

    截取含有中英文的字符串,按字节进行截取,当出现汉字时不能截取半个汉字要把汉字补全。

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

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

    java中截取带汉字的字符串

    ### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取这些字符串。如果直接按照字节(byte)来进行分割,很容易导致中文字符被截断一半,从而形成乱码。...

    字符串截取(按字节)

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

    asp.net c# String类添加按字节截取字符串的扩展方法

    在ASP.NET C#开发环境中,处理字符串是一项常见且重要的任务,尤其是在需要对字符串进行精确控制的情况下,如按字节截取字符串。本文将详细介绍如何为C#中的`String`类添加一个扩展方法,该方法允许我们按照字节而非...

    delphi 实现截取字符串中中文+英文混合截取

    这个函数`SafeSubstring`接收字符串S、起始字节位置StartByte和截取的字节数LenBytes,返回一个从指定字节位置开始,长度为LenBytes字节的新字符串。注意,这个函数假设输入的都是有效的字节位置,没有进行边界检查...

    JavaScript截取中文字符串

    ### JavaScript截取中文字符串知识点详解 #### 一、引言 在进行文本处理时,我们经常需要对字符串进行截取操作。特别是在处理包含多种字符集(如英文与中文)的字符串时,考虑到不同字符编码长度的差异性,简单地...

    JAVA如何按字节截取字符串

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

    超实用c#按字节截取长度(原创)

    根据给定文件的信息,本文将深入探讨如何在C#中实现一种高效的按字节截取字符串的方法,尤其针对包含单字节与双字节混合字符的情况。这种方法特别适用于处理中文等双字节字符与英文等单字节字符混合的情况。 ### 一...

    按字节长度截取字符串(支持截取带HTML代码样式的字符串)

    为了按字节截取,我们需要自己实现逻辑。以下是一个示例,展示了如何创建一个函数,该函数能够处理HTML字符串并按照字节长度进行截取: ```csharp public static string SubStringHtml(string input, int ...

    PHP中如何截取中文字符串

    在PHP中处理中文字符串截取是一项常见的...PHP的mbstring扩展提供了强大且安全的方法来处理多字节字符,确保了中文字符串截取的准确性。在编写代码时,要时刻关注字符串的编码类型,以避免出现乱码或截取错误的情况。

    C#字符串截取固定长度的方法

    - **简单截取**:适用于仅包含单字节字符的字符串。 - **考虑多字节编码**:适用于包含多字节字符(如中文)的字符串。 - **利用正则表达式**:适用于需要进行更复杂条件判断的截取需求。 在实际开发过程中,应根据...

    实现一个按字节来截取字符串的方法,功能类似于string类的substring方法,

    实现一个按字节来截取字符串的方法,功能类似于string类的substring方法,String类是按字符截取 的,例如"中国abc".substring(1,3),将返回...要求按字节截取,一个英文字符当一个字节,一个中文字符当两个字节.  

    C++中英混合字符串截取

    这个示例首先将UTF-8字符串转换为宽字符串,然后遍历每个字符,如果遇到非字母字符(可能是汉字),则计算其字节长度,并相应调整截取位置。最后,将截取后的宽字符串再转换回UTF-8。 在实际项目中,可能还需要考虑...

    根据字节数截取字符串

    标题“根据字节数截取字符串”涉及的核心概念是字符串截取,这通常在处理有限的显示空间、传输限制或者存储容量时变得尤为重要。本话题将深入探讨如何在Java语言中根据字节数来截取字符串,并结合给出的`SplitString...

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

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

    C#字符串截取

    此方法用于获取指定长度的字符串,并特别考虑了中文字符的情况,因为中文字符通常占用两个字节的空间。 #### 参数说明: - `stringToSub`:需要截取的原始字符串。 - `length`:需要截取的长度(考虑到中文字符占两...

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

    Java 字符串截取函数 ...本例中,我们实现了一个 Java 字符串截取函数,该函数可以截取指定字节的字符串,并保证汉字不被截半个。该函数使用 `substring` 方法来实现字符串截取,并且可以应用于各种字符串处理场景。

    按byte截取字符串

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

Global site tag (gtag.js) - Google Analytics