BREW终端下通过http协议访问jsp的编码问题
正在加班,刚解决一些问题,写一些,记录下来。
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日
继续加班中……
浙公网安备 33010602011771号