您的位置:首页 > 理论基础 > 计算机网络

BREW终端下通过http协议访问jsp的编码问题

2004-11-19 20:20 555 查看
正在加班,刚解决一些问题,写一些,记录下来。

BREW终端下只能以UTF-8格式传递字符。
今天遇到的情况是BREW通过http访问jsp传递中文的参数值,然后经过jsp的编码转换,最后形成sql语句,从mysql中读取数据。
开始的情况是在jsp中通过一段将UTF-8转换成GB2312的函数将字符转换为GB编码。

public class ChangeEncoding
{
  private static int by2int(int b)
  {
      return b & 0xff;
  }

  public static String UTF82GB2312(String param)
  {
      try
      {
          param = new String(param.getBytes("ISO8859-1"), "UTF-8");
          byte[] bytes = param.getBytes("UTF-8");
          param = UTF82GB2312(bytes);
          return param;
      }
      catch(Exception e)
      {
          return null;
      }
  }

  public static String UTF82GB2312(byte buf[])
  {
      int len = buf.length;
      StringBuffer sb = new StringBuffer(len/2);
      for(int i =0; i<len;i++)
      {
          if(by2int(buf[i])<=0x7F) sb.append((char)buf[i]);
          else if(by2int(buf[i])<=0xDF && by2int(buf[i])>=0xC0)
          {
              int bh = by2int(buf[i] & 0x1F);
              int bl = by2int(buf[++i] & 0x3F);
              bl = by2int(bh << 6 | bl);
              bh = by2int(bh >> 2);
              int c  =  bh<<8 | bl;
              sb.append((char)c);
          }  else if(by2int(buf[i])<=0xEF && by2int(buf[i])>=0xE0){
              int bh = by2int(buf[i] & 0x0F);
              int bl = by2int(buf[++i] & 0x3F);
              int bll = by2int(buf[++i] & 0x3F);
              bh = by2int(bh << 4 | bl>>2);
              bl = by2int(bl << 6 | bll);
              int c  =  bh<<8 | bl;
      //空格转换为半角
      if(c==58865){
          c = 32;
      }
              sb.append((char)c);
          }
      }
      return sb.toString();
  }
}
然后形成sql语句,并且在Tomcat的状态监视窗口打印出sql语句。
打印的结果类似SELECT * FROM Table WHERE Name = '远飞' OR IDCard = '1234567'。
看起来sql语句没什么问题。只是在程序中能查询到一条记录。
而把这条语句放到控制台中执行总是得到3条记录。
百思不得其解。没什么问题啊。

后来考虑应该是'远飞'编码的问题。因为IDCard满足1234567的只有1条记录,而Name满足'远飞'的有3条记录。
将'远飞'经过getBytes("ISO8859_1")编码转换。
然后再执行查询终于返回了3条记录。

总结:这次执行查询忽略了一个问题,就是mysql会把各种编码格式的String转换成ISO8859_1的编码。
即使查询语句看起来是很正常的中文,也要经过ISO8859_1的编码转换才能正常执行查询。
不过JAVA编码这部分个人感觉还是有些乱,要再深入研究才好。
要弄明白一个String从被BREW终端发出要进过多少次编码转换,都转换成什么编码,例如String还要经过Tomcat的两次转换,弄清所有顺序才能将得到最终想得到的编码格式。

远飞
2004年11月19日
继续加班中……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: