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日
继续加班中……
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日
继续加班中……
相关文章推荐
- localhost:8080/XXX.jsp 本机无法访问,其他人的电脑却可以通过IP地址访问本机的WEB应用的问题
- 通过filter实现servlet和jsp的中文编码问题:
- H3C防火墙——回环流量问题(内网终端通过外网IP访问内部服务器)
- 关于jsp页面通过el表达式访问struts2值栈的问题
- 关于JSP不能通过浏览器直接访问,要通过servlet跳转,但一个jsp文件里面用<iframe>标签包含了另一个jsp的访问问题
- 解决SpringBoot项目打成jar包访问不了jsp模板的问题: SpringBoot项目集成jsp模板打成war包 然后通过java -jar 命令启动访问
- JS+JSP通过img标签调用实现静态页面访问次数统计的方法
- JSP编码问题浅析
- 通过独立html用ajax访问基于ssh2中方法的问题
- JSP/Servlet中的汉字编码问题
- JAVA基础一大堆0812通过Http协议访问网络
- jsp中的编码问题
- JSP/Servlet 中的汉字编码问题
- springMVC实现 如何通过TOMCAT访问WEB-INF下的JSP文件
- 解决jsp页面使用网络路径访问图片的乱码问题
- 问题一:如何通过jsp输入框的形式,操作后台数据(OK)
- JSP Servlet编码问题总结
- 记某个客户不能通过HTTPS访问在AWS部署站点的问题
- 通过读写文本文件小结“关于python处理中文编码的问题”
- 通过过滤器(Filter)解决JSP的Post和Request中文乱码问题