UTF-8 到 GB2312 的转换高手请进

解决方案 »

  1.   

    直接 String.getBytes("GB2312");就得到直正的GB2312的字节码。String iso_Value = new String(uft8_Value.getBytes("iso-8859-1"),"GB2312");你既然从把字符串转接成iso-8859,为什么把内码为iso-8859的数据当作GB2312来用?不是问号才怪。当你使用String( xxx, "GB2312" )时,是告诉String, xxxx中的内码是使用GB2312来存放的,而不是要求String用GB2312来存放。你的理解刚好相反。无论怎么样,Java的String都是按Unicode来存放的。
      

  2.   

    package gkgl.include;import java.sql.Date;
    import java.sql.ResultSet;
    import java.text.DateFormat;
    import java.util.Calendar;
    import java.sql.*;/**
     * 此类各个方法主要是实现公用输出数据.
     * @author htjs
     */public class OutString extends gkgl.basic.StrReplace
    {    private String errmsg = null;    public OutString()
        {
            errmsg = "Error";
        }//end public    /**
        *转换中文字符编码(让jsp提交表单是显示中文简体).
        *@param str 字符串
        *@return String 转换过的字符串
        *@author hu 2002.12.13
        */
        public static String convert(String str)
        {
          try{
             byte[] temp=str.getBytes("ISO-8859-1");
             return new String(temp);
          }catch(Exception e){return "";}
        }
        /**
        *转换中文字符编码(让中文简体转换成ISO8859_1编码).
    *@param str 字符串
    *@return String 转换过的字符串
        *@author hu 2002.12.13
        */
        public static String reconvert(String value){
          try {
      //return new String(value.getBytes("gb2312"),"ISO8859_1");
      //在gb2312字符集中很多汉字无法解析(如圪垱),所以应该使用GBK
          return new String(value.getBytes("GBK"),"ISO8859_1");}
          catch(Exception e){return "";}
        }
        /**
        *四舍五入.
        *@param value double类型的值
       *@return double
       */
        public static double round(double value)
        {
            double f = Math.round(value * 100D);
            f /= 100D;
            return f;
        }//end public    /**
    *格式化日期.
    *@param d java.sql.Date型日期
    *@return String 格式化后的日期字符串
    */
        public static String formatdate(Date d)
        {
            if(d != null)
            {
                java.text.DateFormat df = java.text.DateFormat.getDateInstance();
                return df.format(d);
            }else{
                return "";
            }//end if
        }//end public    /**
    *格式化日期
    *@param d 日期
    *@return String 返回“年月日”
    */
        public static String formatnyr(java.util.Date d)
        {
          if(d != null)
          {
      Calendar c=Calendar.getInstance();
      c.setTime(d);
            String date =String.valueOf(c.get(Calendar.YEAR))+"年"+String.valueOf(c.get(Calendar.MONTH))+"月"+String.valueOf(c.get(Calendar.DAY_OF_MONTH))+"日";
              return date;
          }else{
                return "";
          }//end if
        }//end public    /**
    *格式化日期
    *@param d java.sql.Date 日期
    *return String 返回“年月日”
    */
        public static String formatnyr(java.sql.Date d)
        {
          if(d != null)
          {
      String tmp=formatdate(d);
      int s1=tmp.indexOf("-");
      int s2=tmp.lastIndexOf("-");
      String rnt=tmp.substring(0,s1)+"年";
      rnt+=tmp.substring(s1+1,s2)+"月";
      rnt+=tmp.substring(s2+1,tmp.length())+"日";
      return rnt;
          }else{
                return "";
          }//end if
        }//end public
      

  3.   

    quote;gzlucky(Lucky)
             String str ="中文转换问题" ;
    byte[] bt = str.getBytes("UTF-8");
    String uft8_Value = new String(bt,"UTF-8");
    这三条语句我只是想得到一个UTF-8编码的字符串,如果直接用String.getBytes("GB2312")得到当然是GB2312编码了,我现在的目的是想用一个UTF-8编码的字符串(本例中为uft8_Value) 
    通过iso8859作中介来转换为GB2312的编码,String iso_Value = new String(uft8_Value.getBytes("iso-8859-1"),"GB2312");现在的iso_Value应该是GB2312的编码了,
    但打印出来的是???,不知什么原因,
      

  4.   

    quote:fuzhan820(fzd)public class testEncoding{ public static void main(String[] args){
    try{
    System.out.println("gbk----iso"+reconvert("我的中国"));
    System.out.println("ISO-8859-1="+convert("我的中国")); }catch(Exception ex){
    ex.printStackTrace();
    }
    }
    public static String reconvert(String value){
          try {
     //return new String(value.getBytes("gb2312"),"ISO8859_1");
     //在gb2312字符集中很多汉字无法解析(如圪垱),所以应该使用GBK
          return new String(value.getBytes("GBK"),"ISO8859_1");}
          catch(Exception e){return "";}
        }
    public static String convert(String str)
        {
          try{
             byte[] temp=str.getBytes("ISO-8859-1");
             return new String(temp);
          }catch(Exception e){return "";}
        }
    }
    我用上面这个class 测试了你的两个方法,convert 和reconvert方法,但打印出来没有一个是中文的,你看一下看,错在那里,难道我这样调用有错吗?
      

  5.   

    String uft8_Value = new String(bt,"UTF-8");
    这时候,uft8_Value中的字符串已不是你所想象的UTF-8,而是String中统一使用的UniCode,
    String(bt,"UTF-8") 只是告诉String,bt是一个UTF-8的字节串。String(value.getBytes("GBK"),"ISO8859_1")
    这里 value.getBytes("GBK"),是要求String把字符串输出为GBK,但你却在重新赋值时:
    String(xxx, "ISO8859_1"),告诉String 这个原本被你输出为GBK的字节串是一串ISO8859_1,你说这能不错吗?
      

  6.   

    quote : gzlucky(Lucky)
    多谢了,你说的我算明白了
    但我还有一个疑惑,不知这句话这么解释,这是从浏览器接收参数name,name为带有中文的字符串new String((request.getParameter("name")).getBytes("iso-8859-1"),"GB2312");
    这句话确实能将request.getParameter("name")转换为中文,而直接打印request.getParameter("name")则是乱码, 按你的说法,
    上面那句话,是告诉String 这个原本输出为iso-8859-1的字符串是一串GB2312,那打印出来应该是乱码才对,但他确能正确打印.
      

  7.   

    其实你贴这个程序我就估计到是码制转接的问题,我原以为是数据库的问题,我曾在网上看到过一些数据库的码制转换时需要这样用。是这样的,他的Oracle数据库好象是以ISO-8859作为字符集来创建的,而且库表内使用了中文数据,并使用了一段时间,后来在开发网上应用的时候才发现,没办法就用了你所说的类似方法进行转换。读取时以ISO-8859的方式提取转换成GBK,写的时候把GBK转换成ISO8859再写到数据库中。我估计这个与你所说的情况比较相似。
      

  8.   

    quote ; gzlucky(Lucky) 
    谢谢了,大概用我都会用了,我估计new String((request.getParameter("name")).getBytes("iso-8859-1"),"GB2312");这句话应该是这样的request.getParameter("name"))接收的字符串应该是UTF-8编码,因为这是浏览器默认的编码方式,然后getBytes("iso-8859-1")是把他转换为iso-8859-1编码,再以他为中介转换为GB2312编码.