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