String b = new String(dish_id.getBytes("ISO-8859-1"), "UTF-8"); 

解决方案 »

  1.   

    你不会把页面编码格式改成UTF-8吗?就不用转。
    或者filter进行转码。
      

  2.   

    搞错了 - - 
    应该是
    String b = getParameter("name");
    b = new String(b.getBytes("GBK"), "UTF-8");
      

  3.   

    提交过来也应该是request.getParameter("name");吧
    new String(dish_id.getBytes("ISO-8859-1"), "UTF-8"); 
    new String(dish_id.getBytes("ISO-8859-1"), "GBK"); 
    new String(dish_id.getBytes("GBK"), "UTF-8"); 
    new String(dish_id.getBytes("GBK"), "ISO-8859-1"); 
    new String(dish_id.getBytes("UTF-8"), "GBK"); 
    new String(dish_id.getBytes("UTF-8"), "ISO-8859-1"); 
    把这些挨个转一遍看看哪个是正确的
      

  4.   

    还是不行。
    可以确定是GBK转UTF-8的问题,
    当转换的中文是偶数位时正常,奇数位时出错。
    苦恼中!!!
      

  5.   

    请问一下 dish_id 这里面的值是从什么地方来的?
      

  6.   

    这种情况一般会出现在 Web 应用 GET 方式提交上,在 IE 中会产生这种情况,主要是
    由于提交参数中的中文没有采用 URL 编码。
      

  7.   

    String b = new String(dish_id.getBytes("ISO-8859-1"), "UTF-8"); 
      

  8.   

    dish_id是上一个页面提交来的
    method="pos" 
    enctype="multipart/form-data"
    <form action="/servlet/dish_add" method=post enctype="multipart/form-data" >
      

  9.   

    应该是传过来的时候就已经乱码了
    在JSP页面传过来的时候调用JavaScript的encodeURI()的方法包装要传递的URL
    然后再用String b = new String(dish_id.getBytes("ISO-8859-1"), "UTF-8"); 
      

  10.   

    <form action="/servlet/dish_add" method=post enctype="multipart/form-data" >已经不是普通的POST方法了
    把Action用encodeURI()包装一下试试
      

  11.   

    把Action用encodeURI()包装一下试试
    怎么包装?
    第一次听说
      

  12.   

    action="javasript:encodeURI('/servlet/dish_add')"
      

  13.   

    action="javascript:encodeURI('/servlet/dish_add')" 
    少打了个c
      

  14.   

    GBK的字符从页面传入后台的时候可以通javascript的encodeURI进行两次encode.传到服务端只要通过URLDecoder.decode(req.getParameter("..."));
    这样就不会出现乱码了。
      

  15.   


    public String convertString(String gbk){
    String utf8 = new String(gbk2utf8(gbk),"UTF-8");
    } public byte[] gbk2utf8(String chenese) {
    char c[] = chenese.toCharArray();
    byte[] fullByte = new byte[3 * c.length];
    for (int i = 0; i < c.length; i++) {
    int m = (int) c[i];
    String word = Integer.toBinaryString(m); StringBuffer sb = new StringBuffer();
    int len = 16 - word.length();
    for (int j = 0; j < len; j++) {
    sb.append("0");
    }
    sb.append(word);
    sb.insert(0, "1110");
    sb.insert(8, "10");
    sb.insert(16, "10"); String s1 = sb.substring(0, 8);
    String s2 = sb.substring(8, 16);
    String s3 = sb.substring(16); byte b0 = Integer.valueOf(s1, 2).byteValue();
    byte b1 = Integer.valueOf(s2, 2).byteValue();
    byte b2 = Integer.valueOf(s3, 2).byteValue();
    byte[] bf = new byte[3];
    bf[0] = b0;
    fullByte[i * 3] = bf[0];
    bf[1] = b1;
    fullByte[i * 3 + 1] = bf[1];
    bf[2] = b2;
    fullByte[i * 3 + 2] = bf[2]; }
    return fullByte;
    }
      

  16.   

    -_-!
    细细品味了一下,发现我的代码写错了,想修改,发现没法修改发出的帖子.....
    算了,重新搞一次..
        public String convertString(String gbk){
         String utf8 = "";
            try {
    utf8 = new String(gbk2utf8(gbk),"UTF-8");
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    return utf8;
        }    public byte[] gbk2utf8(String chenese) {
            char c[] = chenese.toCharArray();
            byte[] fullByte = new byte[3 * c.length];
            for (int i = 0; i < c.length; i++) {
                int m = (int) c[i];
                String word = Integer.toBinaryString(m);            StringBuffer sb = new StringBuffer();
                int len = 16 - word.length();
                for (int j = 0; j < len; j++) {
                    sb.append("0");
                }
                sb.append(word);
                sb.insert(0, "1110");
                sb.insert(8, "10");
                sb.insert(16, "10");            String s1 = sb.substring(0, 8);
                String s2 = sb.substring(8, 16);
                String s3 = sb.substring(16);            byte b0 = Integer.valueOf(s1, 2).byteValue();
                byte b1 = Integer.valueOf(s2, 2).byteValue();
                byte b2 = Integer.valueOf(s3, 2).byteValue();
                byte[] bf = new byte[3];
                bf[0] = b0;
                fullByte[i * 3] = bf[0];
                bf[1] = b1;
                fullByte[i * 3 + 1] = bf[1];
                bf[2] = b2;
                fullByte[i * 3 + 2] = bf[2];        }
            return fullByte;
        }
    顺手把那个大大的转换原理贴出来:
    UTF-8 采用变长度字节来表示字符,理论上最多可以到 6 个字节长度(一个字符六个字节)。
    UTF-8 编码兼容了 ASC II(0-127), 也就是说 UTF-8 对于 ASC II 字符的编码是和 ASC II 一样的。
    对于超过一个字节长度的字符,才用以下编码规范:
    左边第一个字节1的个数表示这个字符编码字节的位数,
    例如两位字节字符编码样式为为:110xxxxx 10xxxxxx;
    三位字节字符的编码样式为:1110xxxx 10xxxxxx 10xxxxxx.;
    以此类推,六位字节字符的编码样式为:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx。
    xxx 的值由字符编码的二进制表示的位填入。只用最短的那个足够表达一个字符编码的多字节串。
    例如:
    Unicode 字符: 00 A9(版权符号) = 1010 1001,
    UTF-8 编码为:11000010 10101001 = 0x C2 0xA9;
    字符 22 60 (不等于符号) = 0010 0010 0110 0000,
    UTF-8 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0 UTF-8的编码原理和特性:U+0000~U+007E 1 _ _ _ _ _ _ _ (7bits)U+0080~U+07FF 1 1 0_ _ _ _ _ 1 0_ _ _ _ _ _ (11bits)U+0800~U+FFFF 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ (16bits) 
      

  17.   

    GBK和utf-8编码占用的字节数是不一样的。所以不可以直接转换。你可以通过
    utf8Content = new String(str.getBytes(),"utf-8");
    GBKStr = URLDecoder.decode(utf8Content, "GBK");
    你可以试一下,不知是否可行。