new String(str.getBytes("utf8"));这个方法调用你的系统的指定的语言。如果你系统用的默认字符集是gbk,则他相当于new String(str.getBytes("utf8"),"GBK");这个和系统类型没有关系,只是系统语言的设置有关系。
javac -encoding gbk xx.java 的问题,我个人看法是他编译时把你的常量字符串用gbk编码转为byte数组,然后写入class文件。什么都不加,则采用系统默认字符集进行转换。

解决方案 »

  1.   

    看看你的jvm属性file.encoding的值是什么。jvm会把它作为缺省encode.
    真正理解file.encoding的含义和它的作用范围,我可以保证你不会再问这样的问题。也不会再碰到编码和中文之类的问题。
      

  2.   

    或者是我说得不够详细现在我是遇到这样的情况:
    new  String(str.getBytes(  "utf8  "));我用这个来处理我的字符串,可以正常(在linux下面),但是我指定了是new  String(str.getBytes(  "utf8  "),"GBK");或者是gb2312,又或者是ISO8859-1的话,则我处理的字符串为乱码(无论是在windows还是在linux下面)如果在linux下面编译,则需要加-encoding gb2312或者是GBK来编译java文件,才可以正常处理我的字符串啊。(也是同样的程序同样的处理)所以才有此一问。
      

  3.   

    如果你再你的程序里面有这种写死的字符串,例如:s="中文".
    这种程序拿到其他的平台上编译的,如果encoding不同会很容易出错。
    因为字符串s的编码是你写源程序时的encoding,到不同的平台上之后javac会认为s的编码方式是当前平台的编码方式。
    所以java的原文件里最好不要写这种多字节编码的字符串。
      

  4.   

    如果我的s是前一个页面提交过来的中文字符串呢??关键的是现在我知道我的file.encoding是iso8859-1,可是:
    当我:
    new String(str.getBytes("iso8859-1"),"iso8859-1");
    的时候处理不正确而我:
    new String(str.getBytes("iso8859-1"));
    后面没有知道字符集的时候就可以正常处理我的字符串请问上面这两种处理有什么区别呢???