判断一个字符是双字节仍是单字节

判断一个字符是双字节还是单字节
对于字符串的处理,经常会遇到需要判断字符是双字节还是单字节(或者全角和半角)的情况,因为双字节字符和单字节字符在屏幕上所占用的空间是不同的,通常情况下双字节字符占用的空间是单字节字符的两倍。比如,一个字符串,可能包含中文英文数字和各种符号等等,将其输出到屏幕上,需要根据长度判断在哪里进行截断(网页编程中经常用到)。
最常见的两种方式。
一种是通过String的getBytes().length来判断,单个字符构成的字符串,其getBytes().length若大于1,则为双字节字符,否则为单字节字符。不过需要注意的是,这种方式有一定缺陷,就是当使用英文操作系统来执行getBytes().length这句代码的时候,单字节双字节文本得到的结果是一样的。这是因为不同的JAVA虚拟机对于字符的处理方式不同。所以,虽然这种方法很简单,而且在大多数时候很有效,但是考虑到可能会有少部分使用英文操作系统的人,还是建议用下一种方法。
另外一种是通过判断某一位的字符是否大于0x80,如果大于则为双字节字符,否则为单字节字符。




/**编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。
	 * 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,
	 * 应该输出为"我ABC"而不是"我ABC+汉的半个"
	 * @param str
	 * @param byteLength
	 * @return
	 */
	private static String getStringByInputStringAndLength(String str,int byteLength)
	{
//		int byteCount = 0;//字节计数
//		int charCount = 0;//字符计数
//		for(int i=0;i<byteLength;i++)
//		{
//			charCount++;
//			String strTemp = String.valueOf(str.charAt(i));
//			int currentByteNum = strTemp.getBytes().length;
//			if(currentByteNum==2)
//			{
//				byteCount+=2;
//			}
//			else if(currentByteNum==1)
//			{
//				byteCount+=1;
//			}
//			if(byteCount>byteLength)
//			{
//				charCount--;
//				break;
//			}
//		}
//		System.out.println("num:"+charCount);
//		return str.substring(0, charCount);	
		
		int byteCount = 0;//字节计数
		int charCount = 0;//字符计数
		for(int i=0;i<byteLength;i++)
		{
			charCount++;
			int charIndex = (int)str.charAt(i);
			System.out.println("charIndex:"+charIndex);
//			int currentByteNum = strTemp.getBytes().length;
			if(charIndex > 128)
			{
				byteCount+=2;
			}
			else
			{
				byteCount+=1;
			}
			if(byteCount>byteLength)
			{
				charCount--;
				break;
			}
		}
		System.out.println("num:"+charCount);
		return str.substring(0, charCount);	
	}