`

字符、字节

阅读更多
一、通过getBytes("")获取各编码格式下的字符长度

字符指一个字母或一个字或一个标点或一个符号,不一定几个字节,看情况定,编码格式不同,每个字符所占字节不同
类型      GBK(字节)    UTF-8(字节)
字母数字  1              1            
汉字      2              3            
全角标点  2              3            
半角标点  1              1            

1.String  length();//字符的长度

如:
String str = "中文123" ;
int len = str.length;// len =5 ;

为字符长度,因为 其采用 Unicode 编码形式,存储的是 每个字符在 编码集合中的 编号(在内存中 每两个字节存储一个编号)
  
2.length  ;//字节的长度

如:
bytes [] byte = str.getBytes();
int lent = byte.length; // 字节长度 , 



java代码:
		String name = "人1z,。";// 汉字 数字 字母 半角 全角
		try {
			byte [] test = name.getBytes("GBK");
			System.out.println(""+name.length()+"  " +test.length); // 7 = 2 + 1 + 1 + 1 + 2
			byte [] test1 = name.getBytes("UTF-8");
			System.out.println(""+name.length()+"  " +test1.length);// 9 = 3 + 1 + 1 + 1 + 3
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
     

数据表中对应的varchar char 类型 对应字符的长度 而不是字节的长度


		String str = "汉";
		byte[] bytes = str.getBytes("Unicode");
		for(int index = 0 ; index < bytes.length ; index++){
			System.out.println(bytes[index]);
		}
		System.out.println(bytes.length);


二、getBytes("Unicode") 相关工具类分析
Unicode 表示一个汉字用两个字节;
此处输出长度为4;
-2
-1
108
73

前两为为顺序表示;大头、小头;
http://blog.csdn.net/lcfeng1982/article/details/6830584


// 通过 length 即 字节长度截取指定长度的字符串,excepLength 为截取出现问题时的最低截取长度
	public static String bSubstring(String s, int length, int excepLength) {
		try {
			s = s.replaceAll("\\s*", "");
			byte[] bytes = s.getBytes("Unicode");  // Unicode 默认按照UnicodeLittleUnmarked 小头规则,一个字符两个字节表示,高位在第二个字节的位置
// 一个字符串总在第一个字符的编码前面加上编码顺序的标识
			int n = 0; // 表示当前的字节数
			int i = 2; // 要截取的字节数,从第3个字节开始  
			// 0 1 2 按照数组下标的顺序取值;前两位为顺序标识,即告知系统当前的编码顺序时小头;系统默认处理
// 英文数字编码:高位为0;汉字高低位都不为0
// 当前系统按照Unicode取编码结果,默认按照大头顺序,即高位在前
// 从第三个字节开始,即i=2处开始,所以else 上判断是否为0,为0表示当前为ASCII中的值
			for (; i < bytes.length && n < length; i++) { 
				// 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节
				// 从 2 开始,奇数位加一,偶数为不为0加一,length 指字节的长度,而不是字符的长度;
				// i 是当前的数组下标
				if (i % 2 == 1) {
					n++; // 在UCS2第二个字节时n加1
				} else {
					// 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节
					if (bytes[i] != 0) {
						n++;
					}
				}
			}
			// 如果i为奇数时,处理成偶数
			if (i % 2 == 1) { // 为奇数即字符串中含有数字字母,偶数个,此处灵活配置,因为两个字符标识一个字符,只是强制判断当前是汉字且只有一位,舍弃
				// 该UCS2字符是汉字时,去掉这个截一半的汉字
				if (bytes[i - 1] != 0)
					i = i - 1;
				// 该UCS2字符是字母或数字,则保留该字符
				else
					i = i + 1;
			}
			return new String(bytes, 0, i, "Unicode");
		} catch (Exception e) {
			JrdLogManager.runLog(Level.ERROR, "bSubstring exception :" + e);
			return s.replaceAll("\\s*", "").length() > excepLength ? s.replaceAll("\\s*", "").substring(0, excepLength) : s;
		}
	}



分享到:
评论

相关推荐

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

    字符串是由字符组成的序列,而“字符串按照指定的字节数来截取”这个话题,就是指如何在字符串中提取固定字节数的部分。在不同的编程语言中,都有相应的函数或方法来实现这一功能。 在Python中,可以使用内置的`...

    Java字符流与字节流区别

    字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流...

    计算字符串中的单双字节字符个数

    单字节字符通常指的是ASCII字符,而双字节字符则涉及到Unicode字符集,如汉字和其他非英文字符。下面将详细探讨如何计算字符串中的单双字节字符个数,以及它们在实际应用中的作用。 首先,让我们理解什么是单字节...

    textarea 控制输入字符字节数(示例代码)

    本篇文档提到的“textarea 控制输入字符字节数”的知识点,便是介绍如何通过JavaScript脚本来限制`&lt;textarea&gt;`输入框中输入内容的字节长度。文档中提供了具体的示例代码,通过这些代码,开发者能够限制用户在输入时...

    C# 按照字节长度截取字符串

    在C#编程中,有时我们需要根据字节长度来截取字符串,这可能是因为要处理不同编码格式的数据,或者为了适应特定的传输限制。本篇将详细介绍如何在C#中按照字节长度截取字符串,并结合正则表达式进行操作。 首先,...

    java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节;

    java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...

    字符串变成字节

    字符串变成字节

    如何处理错误ORA-29275:部分多字节字符

    ### 如何处理错误ORA-29275:部分多字节字符 #### 问题背景与描述 在Oracle数据库操作过程中,用户可能会遇到一个特定的错误提示——ORA-29275:部分多字节字符。这一错误通常出现在执行查询`SELECT * FROM V$...

    字节,字符,字符串的区别

    在C#编程中,字节(byte)、字符(char)和字符串(string)是三种基本的数据类型,它们在处理文本和数据流时扮演着不同角色。理解它们之间的区别至关重要,尤其是在涉及网络传输、文件存储和编码转换等场景。 首先...

    计算机字符编码Unicode与Windows.pdf

    本书主要表现Unicode编码的平面数、编码方法、码位数、字符字节数、字符区域划分等重要概念 通过UTF32、UTF-16、UTF-8以及ANSI之间的对比表现字符字节数的变化规律。表现Windows操作系统个版本与Unicode之间的关系。...

    VB获取字符串的字节总数

    在VB(Visual Basic)编程环境中,我们经常需要处理字符串数据,并且在某些情况下,了解字符串的字节总数是非常重要的。字节总数可以帮助我们计算存储需求、传输数据的大小或者进行编码转换等操作。本篇文章将深入...

    JAVA 字符流与字节流

    在Java编程语言中,输入/输出(I/O)操作是处理数据流的关键部分,而字符流与字节流则是实现这些操作的两种基本方式。理解它们的区别和应用场景对于任何Java开发者来说都是至关重要的。 ### 字节流 字节流是最基本...

    多字节和宽字节字符相互转化

    该程序在VS2008上测试通过,代码可以实现多字节和宽字节字符之间的相互转换。

    将字符串按字节分割成等长字符

    除了将记录导出到word方法外(word要把“允许西文在单词中间换行"勾上),笔者写了一个自定义函数,可将字符按用户指定的字节长度参数分割成等长字符,调用时用test(字符串,字节长度)即可,比如字符为”CSDN是个...

    字符串和字节的转换

    字符串和字节的转换。字节数组转换为字符串,字符串转换成字节数组.

    C#获取字符串的字节数

    ### C#中获取字符串的字节数方法及应用实例 #### 概述 在软件开发过程中,特别是涉及到国际化和多语言支持的应用程序中,经常需要处理不同编码下的字符串长度问题。例如,在某些应用场景下,我们需要限制用户输入...

    字符串与字节数组之间的转换

    ### 字符串与字节数组之间的转换 在计算机编程领域,数据的转换是一项非常重要的工作,尤其是在处理网络通信、文件读写等场景时。本文将详细介绍如何在.NET框架下实现字符串与字节数组之间的转换,特别是字符串到16...

    java字节与字符

    ### Java字节与字符 #### 一、字节流与字符流的概念 在Java的I/O包中,根据处理的数据类型不同,可以将流分为两大类:字节流和字符流。 - **字节流**:处理的是8位的数据单元,即字节,主要适用于处理二进制文件...

    C#16进制与字符串字节数组之间的转换代码

    根据给定文件的信息,我们可以总结出以下关于C#中十六进制与字符串、字节数组之间转换的相关知识点: ### C#中十六进制与字符串、字节数组之间的转换 #### 一、概述 在计算机编程中,经常需要进行不同数据格式...

    vb6.0 字节数组和字符串的相互转换.rar

    在VB6.0编程环境中,字节数组和字符串之间的转换是常见的操作,尤其是在处理二进制数据和文本数据之间转换的场景。本教程将详细解释如何在VB6.0中进行这两种数据类型的转换,并通过实际示例进行演示。 1. 字符串转...

Global site tag (gtag.js) - Google Analytics