有点意思 :_)
ISO8859_1与GBK2312在中文上的编码不同,ISO8859_1是把所有的中文都表示为一位字节(ASCII码为63),而GBK2312则把中文表示两个字节,带有负数。所以有两种方法可判断:
1.String的长度等于getBytes后长度就代表是ISO8859_1 或全部英文(如果是JBuilder并设写内码为其它编码则例外)。
2.getBytes中的Byte带有负数 则是GBK2312,GBK, UTF8或其它编码。下面我用第二种方法试试看: public void CheckCharacterSet() {
try {
byte[] byteISO88591, byteGBK2312;
String hello;
hello = "Hello! 世界你好";
System.out.println(hello.length());//输出11
byteISO88591 = hello.getBytes("iso-8859-1");
System.out.println("Length of byteISO88591 is:" + byteISO88591.length);//输出11
if (isStringISO8859_1(byteISO88591)) {
System.out.println("is ISO88591 or all english");
}
byteGBK2312 = hello.getBytes("GB2312");
System.out.println("Length of byteGBK2312 is:" + byteGBK2312.length);//输出15
if (isStringISO8859_1(byteGBK2312)) {
System.out.println("is ISO88591 or all english");
}
}catch (java.io.UnsupportedEncodingException e) {
System.out.println(e);
}
}
public boolean isStringISO8859_1 (byte [] b) {
for (int i = 0; i< b.length; i++) {
if (b[i] < 0) {
return false;
}
}
return true;
}
ISO8859_1与GBK2312在中文上的编码不同,ISO8859_1是把所有的中文都表示为一位字节(ASCII码为63),而GBK2312则把中文表示两个字节,带有负数。所以有两种方法可判断:
1.String的长度等于getBytes后长度就代表是ISO8859_1 或全部英文(如果是JBuilder并设写内码为其它编码则例外)。
2.getBytes中的Byte带有负数 则是GBK2312,GBK, UTF8或其它编码。下面我用第二种方法试试看: public void CheckCharacterSet() {
try {
byte[] byteISO88591, byteGBK2312;
String hello;
hello = "Hello! 世界你好";
System.out.println(hello.length());//输出11
byteISO88591 = hello.getBytes("iso-8859-1");
System.out.println("Length of byteISO88591 is:" + byteISO88591.length);//输出11
if (isStringISO8859_1(byteISO88591)) {
System.out.println("is ISO88591 or all english");
}
byteGBK2312 = hello.getBytes("GB2312");
System.out.println("Length of byteGBK2312 is:" + byteGBK2312.length);//输出15
if (isStringISO8859_1(byteGBK2312)) {
System.out.println("is ISO88591 or all english");
}
}catch (java.io.UnsupportedEncodingException e) {
System.out.println(e);
}
}
public boolean isStringISO8859_1 (byte [] b) {
for (int i = 0; i< b.length; i++) {
if (b[i] < 0) {
return false;
}
}
return true;
}
既然ISO8859_1是把所有的中文都表示为一位字节(ASCII码为63),我可不可以以此为条件判断.当取得的byte中有63时,该编码方式就为iso8859_1呢? 在gb2312编码中,byte为63是个什么字符?恐怕不能输入这个字符.:) private static boolean isISO (byte [] b) {
for (int i = 0; i< b.length; i++) {
if (b[i] == 63) {
return true;
}
}
return false;
}
public static boolean isISO (String str) {
boolean result = false;
try {
byte b[] = str.getBytes();
if (isISO(b)) {
result = true;
}
} catch(Exception e) {
e.printStackTrace();
}
return result;
}
不能, 因为byte为63时就ASCII中的"?",这就是为什么我们在数据库看到中文是"?????"的缘故。
如果只用"?"来判断,用户只输入"I am boy?"这样的话, 就不能判断正确。