unicode字符插入到数据库?

yongjin 2003-09-23 01:48:08
我想在servlet里使用unicode接受前一个页面的值,插入到数据库后重新在页面显示。有什么好方法吗?我写的有问题,不能正确显示传过来的值,也不能正确显示插入数据库后提取出来的值。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
request.setCharacterEncoding("UTF-8");
String sample = request.getParameter("Uname");

String sample2 = new String(sample.getBytes(),"iso-8859-1");

System.out.println(1);
ServletOutputStream sos = response.getOutputStream();
PrintWriter out = new PrintWriter(sos);
out.println("<html>");
out.println("<head><title>Morning</title></head>");
out.println("<body>");
out.println("<br>"+ sample);
out.println("<b>Hello,Byte</b>");
out.println("</body></html>");
DataModule1 dm = DataModule1.getDataModule();
System.out.println(2);
try {
Connection con = dm.getDatabase1().getJdbcConnection();
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO addrtab(TEL) VALUES('" + sample2 + "')");
System.out.println("insert ok");
ResultSet rs = stmt.executeQuery("SELECT * FROM addrtab");
out.println(rs.next());
System.out.println("select ok");
while(rs.next()) {
String x = new String(rs.getString(3).getBytes(),"UTF-8");
System.out.println(x);
out.println("Name:" + rs.getInt(1)+"tel:" + x + "<br>");
}
System.out.println(4);
}
catch(Exception e){
System.out.println("step ex");
e.printStackTrace();
}
finally{
dm.getDatabase1().closeConnection();
}
System.out.println(5);
out.println("<p>The servlet has received a POST. This is the reply.</p>");
out.flush();
}
...全文
230 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
红楼梦魇 2004-02-24
  • 打赏
  • 举报
回复
读(显示)
如果是为了在jsp中显示数据库中的内容,只需要使jsp的charset=UTF-8就ok了。
如果是对于静态的html中如果有文字,显示出来的就是乱码啊。因为这些我们直接写的文字进行unicode编码后就是乱码了,解决办法是:
1 在jsp文件中直接写unicode的中文,比如“宠物”显示在jsp编辑工具中就是这样的“瀹犵墿”
2使用类似struts中message的办法来显示静态的文字。另外我发现了一个使我感到奇怪的问题,使用了struts的message以后,jsp的charset无论是使用gb2312还是UTF-8都可以显示正常的中文,这是怎么回事呢?后来才明白原来struts的字典文件中存的是代表unicode的16进制的ANSI代码,比如“hello,世界”在字典文件中是“hello,\u4e16\u754c”,而无论用何种方式编码,ANSI码的是大家一样的。

1如果jsp中有个text框,我要将text框中的内容写到数据中去,那么要求
1.1 jsp的charset是UTF-8
1.2 requset的内容用UTF-8编码,也就是将filter的编码设为UTF-8就可以了。
那么,这里我可不可不要第二步,不可以,但理解还不深刻;
那么,可不可以在第一步中用gb2312,不可以,因为如果用gb2312,request中的内容在setCharacterEncoding之前就已经不对了,编目方式设对了也没用了。
2我是直接将一个字符串”宠物”写到数据库中去,那么该如何处理呢。
如果是在servlet中,可以直接new String ("宠物");然后用一个sql语句写到数据库中去。
如果是在jsp中,又如果jsp的charset是UTF-8的话,那么要new String("瀹犵墿");
又如果jsp的charset是gb2312的话,那么也是new String ("宠物");就可以了
一般来说2这种情况是很少的
这又是怎么回事呢?这是因为jsp是要解释为servlet的,而且解释的时候是使用的unicode编码,如果charset是UTF-8,又是new String ("宠物");那么servlet中就变成了:
response.setContentType("text/html; charset=UTF-8");

new String ("锟斤拷锟斤拷");//这就不对了
response.setContentType("text/html; charset=gb2312")

new String ("瀹犵墿");//这回对了
总结,如果使用unicode
1 jsp页面中charset用UTF-8
2 过滤器用UTF-8
3 页面中的静态文字内容用message配合字典来显示
4 数据库的读写不需要特别的处理
总之,现在对java中的unicode问题总算是基本搞懂了,这是一件大好事,因为最近我们的项目用unicode作数据库的编码方式,顺势学习,真是爽啊
Jock 2003-09-24
  • 打赏
  • 举报
回复
如果上面的方法还是乱码,
你可以试一下存数据库前后个转一次码!
Jock 2003-09-24
  • 打赏
  • 举报
回复
你写的程序有问题。
String sample2 = new String(sample.getBytes(),"iso-8859-1");
如果getBytes()不加参数是用的系统缺省的编码方式,sample2是iso8859_1编码的,
String x = new String(rs.getString(3).getBytes(),"UTF-8");
取出来转的时候getBytes();也需要指定编码方式。

还有就是根据我的经验给你个建议:
第一个转码的地方改为:
String sample2 = new String(sample.getBytes("GBK"),"iso-8859-1");
从数据库取出来不转码,这样的话两个地方都应该是对的,但是数据库如果是Oracle的话,那要看它安装的时候是什么字符集了,有可能在数据库里是乱码。
junnef 2003-09-24
  • 打赏
  • 举报
回复
使用url传递中文通常都很麻烦,你必须在传递之前就编码,得到一个byte[]数组,然后这样编码byte[0]%byte[1]……的形式编码,然后在下一个页面去的后,解析字符串,重新取得byte[]数组,还原字符串,然后,如果数据库是iso-8859-1,你就要先取得当前字符集编码,然后创建以iso-8859-1编码的字符串,存入数据库,在取出时,先取得iso-8858-1的编码,然后创建当前页面字符集编码的字符串。就是用哪个.getByte("字符集"),new String(byte[],"字符集");反复的转换。
liad 2003-09-24
  • 打赏
  • 举报
回复
在你的前一个页面前面加上以下代码试一试
<%@ page contentType="text/html; charset=UTF8" pageEncoding="gb2312" %>
squallzeng 2003-09-24
  • 打赏
  • 举报
回复
不会,帮楼主顶一下先!!!!!!!
课程目标:学习Java语言中字符串相关的知识、字符编码常识和正则表达式的使用,并完成案例前导课程:《Java工程师必学系列课程》前4部课程内容:本课程是《Java工程师必学系列课程》的第5部分,主要讲解Java语言中字符串相关知识、字符编码常识和正则表达式的使用。本课程涉及的主要内容可以分为四部分:一、String、StringBuffer和StringBuilder类基本常识、基本原理和使用技巧二、字符编码常识三、Java语言正则表达式的详细语法和使用技巧四、实战案例课程说明:在开发Java程序的过程中,最常用的类莫过于字符串相关的类。可以毫不夸张的说,任何一个Java程序,都离不开对字符串保存和处理。很多学员对字符串的理解只是处于比较粗浅的阶段。殊不知,如果对字符串处理的不好,会影响到软件的运行效率。本课程专门讲解字符串相关的知识,将从字符串的存储方式、底层的运行方式等各方面深入讲解其中的原理和技巧。此外,对字符串进行更高级的处理,又要用到正则表达式的相关知识。正则表达式广泛应用于各种与字符串处理相关的场合。它是一套独立的语言系统,经过几十年的完善和发展,现在已经非常的强大,并且形成了国际标准。各种高级编程语言,都实现了自己的表达式引擎。本课程详细的讲解了Java语言中正则表达式的语法和使用技巧。掌握了正则表达式,对编程水平的提高有非常大的帮助!同时,本课程在最后一部分,安排了非常精彩的、完整的实战案例,通过实战的形式切实帮助学员提高解决具体问题的能力!预期效果:认真学习完本课程,学员可以掌握字符串处理及正则表达式相关的系统知识,并能提高实际的编码水平。环境配置要求:学习本课程需安装JDK1.8或更高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或更高版本的开发工具。    因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧