有点意思 :_)
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;
}

解决方案 »

  1.   

    to: Wnyu(已被封杀)
        既然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;
        }
      

  2.   

    to: rexma(乱尘狂风) 
    不能, 因为byte为63时就ASCII中的"?",这就是为什么我们在数据库看到中文是"?????"的缘故。
    如果只用"?"来判断,用户只输入"I am boy?"这样的话, 就不能判断正确。
      

  3.   

    用你说的方法, 如果是GBK2312的"中国人"再加半角的"?"时就不能判断出来。