我的理解是iso-8859-1在字符转换的时候不用改变原编码值的,原本我以为"人",在gb2312中的编码,解析到iso-8859-1应该不变,
可是我运行下面的程序
发现"人"的iso编码是"c8cb",gb2312的编码是"4eba",难道gb2312到iso是有编码算法的
谁能解释下?
public class Test { public static void p(){}
public static void testCharset(String str){

str.getBytes();
}

public static String testEncoding(String charsetname) {        try {
         String stra = "人";
            byte[] bytes = stra.getBytes();            String result = new String(bytes, charsetname);            System.out.println("Receive value: [" + result + "].");
           return testbinary(result);
           
        } catch (UnsupportedEncodingException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }
        return "";
    }
public static String testbinary(String str){
String result ="";
 char[] testchar = str.toCharArray();
 for (int i = 0; i < testchar.length; i++) {
char c = testchar[i];
//result+=Integer.toBinaryString(c);
result+=Integer.toHexString(c);
}
return result;
}
public static void main(String[] args){
String result = Test.testEncoding(
"iso-8859-1" 
// "gb2312"
// "gbk"
// "utf-8"
// "unicode"
);
System.out.println(result);
String result2 = Test.testEncoding(
// "iso-8859-1" 
"gb2312"
// "gbk"
// "utf-8"
);
System.out.println(result2);
}
}

解决方案 »

  1.   

    2套编码原则,当然不一样了。而且 iso 的不能影射GBK的,也就是用ISO的不能显示汉字的。鉴于此,java内部统一采用unicode进行存储。
      

  2.   

    我的理解是iso当然不能把gbk的字符表示出来,iso是全字节编码。但iso会把gbk的二进制数据完整的保留下来,比如“人”的gbk编码是"4eba",当它转化为iso的时候也应该是"4eba",只是iso不能把这个编码解析成字符而已,为什么编码实际是"c8cb"。有点不明白,一直觉得其他字符集转iso的时候应该是无损失转换,即没有算法在里面,这也应该是iso比较通用的方法,比如gbk转iso在转gbk仍然可以的到正确的值,而gbk转utf再转gbk就的不到原来的值,不是吗?
      

  3.   

    "人"的iso编码是"c8cb"?
    汉字在iso中真的还有对应的编码啊,我怎么以前遇到的一直都是"?"或是"3f"这样的符号啊,我觉得2楼的说的比较大概一点.
      

  4.   

     Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式 
      是使用字节流的。 因此Java要对这些字节流经行转化。char是unicode的,而byte是字节. 
      Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度, 
      可以用来告诉你,你用的Convertor。其中两个很常用的静态函数是 
       public static ByteToCharConverter getDefault() ; 
       public static ByteToCharConverter getConverter(String encoding); 
      如果你不指定converter,则系统会自动使用当前的Encoding,GB平台上用GBK,EN平台上用 
      8859_1 
       
      我们来就一个简单的例子: 
         "你"的gb码是:0xC4E3 ,unicode是0x4F60 
         你用: 
         --encoding="gb2312"; 
         --byte b[]={(byte)"u00c4",(byte)"u00E3"}; 
         --convertor=ByteToCharConverter.getConverter(encoding); 
         --char [] c=converter.convertAll(b); 
         --for(int i=0;i0xC4,0x00E3->0xE3,因此0xC4,0xE3被放进了 
    1.网页传参数不提倡用get方法,而且用户可以调整是否用utf-8发送 /////////// 这一行要注意了
    2.建议jsp中最好不要用,实际上加不加这句都有实现中文正常显示的方案,我认为不加方便些,至少不用写这些代码,如下的配置我认为可以使中文正常显示: 
    a.所有的javabean用iso8859-1编译 
    b.jsp文件中不要写以上charset=gb2312的语句(写了反而错)这段更重要了,做后台sql的都看看吧我们的目标是,任一国家的客户端通过Form向Server发送信息,Server把信息存入数据库中,客户端在检索时仍然能够看到自己发送的正确信息。事实上,我们要保证,最终Server中的SQL语句中保存的时包含客户端发送文字的正确Unicode编码;DBC与数据库通讯时采用的编码方式能包含客户端发送的文字信息,事实上,最好让JDBC直接使用UNICODE/UTF8与数据库通讯!这样就可以确保不会丢失信息;Server向客户端发送的信息时也要采用不丢失信息的编码方式,也可以是Unicode/Utf8。 
      如果不指定Form的Enctype属性,Form将把输入的内容依照当前页面的编码字符集urlencode之后再提交,服务器端得到是urlencoding的字符串。编码后得到的urlencoding字符串是与页面的编码相关的,如gb2312编码的页面提交"中文测试",得到的是"%D6%D0%CE%C4%B2%E2%CA%D4",每个"%"后跟的是16进制的字符串;而在UTF8编码时得到的却是"%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95",因为GB2312编码中一个汉字是16位的,而UTF8中一个汉字却是24位的。中日韩三国的ie4以上浏览器均支持UTF8编码,这种方案肯定包涵了这三国语言,所以我们如果让Html页面使用UTF8编码那么将至少可以支持这三国语言。 
      但是,如果我们html/Jsp页面使用UTF8编码,因为应用程序服务器可能不知道这种情况,因为如果浏览器发送的信息不包含charset信息,至多Server知道读到Accept-Language请求投标,我们知道仅靠这个投标是不能获知浏览器所采用编码的,所以应用程序服务器不能正确解析提交的内容,为什么?因为Java中的所有字符串都是Unicode16位编码的,HttpServletRequest.request(String)的功能就是把客户端提交的Urlencode编码的信息转为Unicode字符串,有些Server只能认为客户端的编码和Server平台相同,简单地使用URLDecoder.decode(String)方法直接解码,如果客户端编码恰好和Server相同,那么就可以得到正确地字符串,否则,如果提交地字符串中包含了当地字符,那么将会导致垃圾信息。