由于Java是基于Unicode编码的,因此,一个汉字的长度为1,而不是2。但有时需要以字节单位获得字符串长度。例如:“123Java编程”按字节长度计算是11,而按Unicode计算则是7。为了获得11,需要根据字符的ASCII从头扫描,来获得具体的长度。如果是标准的字符,Ascii的范围是0至255,如果是汉字或其他全角字符,Ascii会大于255。 因此,可以编写如下的方法来获得以字节为单位的字符串长度。
import java.io.UnsupportedEncodingException;
public class test {
public static void main(String[] args) throws UnsupportedEncodingException{
String str = "123java编程";
System.out.println("length():" + str.length());
System.out.println("ASCII:" + getStringLength(str));
System.out.println("正则:" + getStringLengthRegex(str));
System.out.println("GBK:" + getStringLengthCode(str,"GBK"));
System.out.println("UTF-8:" + getStringLengthCode(str,"UTF-8"));
}
public static int getStringLength(String s){
int length = 0;
for(int i = 0; i < s.length(); i++)
{
int ascii = Character.codePointAt(s, i);
if(ascii >= 0 && ascii <=255)
length++;
else
length += 2;
}
return length;
}
/*基本原理是将字符串中所有的非标准字符(双字节字符)替换成两个标准字符(**,或其他的也可以)。这样就可以直接例用length方法获得字符串的字节长度了*/
public static int getStringLengthRegex(String s) {
s = s.replaceAll("[^\\x00-\\xff]", "**");
int length = s.length();
return length;
}
/*按特定的编码格式获取长度*/
public static int getStringLengthCode(String str, String code) throws UnsupportedEncodingException{
return str.getBytes(code).length;
}
}
/*
输出结果:
length():9
ASCII:11
正则:11
GBK:11
UTF-8:13
*/