首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网页制作-> DHTML教程
Java数据库字符国际化-JSP教程,数据库相关
作者:网友供稿 点击:374
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
数据库字符国际化是大家提问最多的问题,例如mysql数据库大家可能在jdbc-url添加useunicode=true&characterencoding=gbk作为中文支持的基本条件。但这有时破坏了数据的完整性,如果某些人粗心大意,就会导致数据编码错误,产生乱码。因此,我们需要一些手段在程序内部进行编码处理。人们一般通过在应用上使用 string(bytes:byte[], enc:string)/string.getbytes(enc:string)进行字符串编解码,这样做虽然易懂,但是如果遇到大字段表格,手动编码时费时费力。

我的方法:通过研究jdk类库,可以感觉到多层处理机制在数据处理上的优越性。我们完全有可能在数据库上建立一个中间层用于字符的国际化处理,我就是这么做的。仔细研究一下jdbc操作数据库出现字符编码问题的根源,很容易发现多数情况是resultset的几个string方法在作怪,因此我们就完全可以编写一个resultset中间层进行国际化处理,源码如下:


public class i18nresultset implements resultset{ private string encoding; private resultset rs; public i18nresultset(resultset rs, string encoding) throws java.io.unsupportedencodingexception{ //检查该编码名称是否被系统支持。 "".getbytes(encoding); this.rs = rs; this.encoding = encoding; } … … //以下几个方法是进行string字符串的重编码. public string getstring(int index) throws sqlexception{ string data = null; try{ data = new string(rs.getbytes(index), encoding); }catch(java.io.unsupportedencodingexception uee){} } public string getstring(stirng field) throws sqlexception{ string data = null; try{ data = new string(rs.getbytes(field), encoding); }catch(java.io.unsupportedencodingexception uee){} } public void updatestring(int index, string value) throws sqlexception{ try{ rs.updatebytes(index, value.getbytes(encoding)); }catch(java.io.unsupportedencodingexception uee){} } public void updatestring(string field, string value) throws sqlexception{ try{ rs.updatebytes(field, value.getbytes(encoding)); }catch(java.io.unsupportedencodingexception uee){} } … …}


可以看出, 所有的string操作都使用特定编码的字节数组进行存取,这样通过定义encoding的值实现数据库存取数据编码的一致性,且encoding完全可以通过在配置信息中动态定义。

同时,上面的程序又可以解决一些固有的字符串处理问题,例如控制符如\r\n导入到数据库中很有可能被解析为\\r\\n使其不能换行,通过字节数组操作,就可以解决这个问题。这样像文章固有格式就可以完整地保留下来而不需要进行额外转换操作。

结论,通过多层处理机制使用中间层对数据库数据进行层层处理可使处理环节之间形成松耦合关系,从而可以进行有效的控制。

下面给一个使用动态代理进行字符控制的代码(原创):

package com.yipsilon.crocodile.database;import java.sql.resultset;import java.lang.reflect.invocationhandler;import java.lang.reflect.method;import java.io.unsupportedencodingexception;/** * 作者 yipsilon * 如要转载, 请通知作者 */public class i18nresultsethandler implements invocationhandler{ private resultset rs; private string encoding; public i18nresultsethandler(resultset rs, string encoding) throws unsupportedencodingexception{ this.rs = rs; "".getbytes(encoding); this.encoding = encoding; } public object invoke(object proxy, method method, object[] args) throws throwable{ string methodname = method.getname(); if(methodname.equals("getstring")){ object obj = args[0]; if(obj instanceof integer){ return decodestring(rs.getbytes(((integer)obj).intvalue()), encoding); }else{ return decodestring(rs.getbytes((string)obj), encoding); } }else if(methodname.equals("updatestring")){ object obj = args[0]; if(obj instanceof integer){ rs.updatebytes(((integer)obj).intvalue(), encodestring((string)args[1], encoding)); }else{ rs.updatebytes((string)obj, encodestring((string)args[1], encoding)); } return null; } return method.invoke(rs, args); } private string decodestring(byte[] bytes, string enc){ try{ return new string(bytes, enc); } catch(unsupportedencodingexception uee){ return new string(bytes); } } private byte[] encodestring(string str, string enc){ try{ return str.getbytes(enc); } catch(unsupportedencodingexception uee){ return str.getbytes(); } }}


使用时调用:

resultset rs = ... ; //原始的resultset结果集string encoding = "gbk"; //字符编码(resultset)proxy.newproxyinstance(rs.getclass().getclassloader(), rs.getclass().getinterfaces(), new i18nresultsethandler(rs, encoding));


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·使用MiddleGen 产生hibernate的数据库表映射文件-JSP教程,数据库相关
·关于防火电线电缆的特性和型号
·一个jsp连接mysql的简单例子-JSP教程,Jsp/Servlet
·ip网络拓扑自动发现
·XML入门精解之文件格式定义(DTD)-.NET教程,XML应用
·Flash 和 ASP / PHP 以及 Javascript 的交互-ASP教程,ASP应用
·VB6如何让程序开机就自动启动-.NET教程,VB.Net语言
·Java数据库字符国际化-JSP教程,数据库相关
·ip网络性能测试系统介绍
·.NET三层经典架构PetShop3.0分析之表现层-.NET教程,.NET Framework
最新文章
·photoshop抠出墨滴入水的流动效果_photoshop教程
·只需十三招 轻松学会利用博客赚钱_网赚技巧
·对话王学集:专注是个人网站的成功法典_站长访谈
·李想:消费者和渠道是垂直类网站的关键_站长访谈
·个人站点提高访问量谋略3_站长心得
·再谈多媒体文件的搜索技巧_google推广
·用自己的方法去做搜索优化和做站_seo网站优化
·backpack - 体验可读写的web服务_站长心得
·搜索引擎优化策略_seo网站优化
·从jz123的发展看个人网站发展的关键_站长心得
相关主题
  • Java数据报编程之广播-JSP教程,数据库相关
  • Java数据报编程之单播-JSP教程,数据库相关
  • Java数据报编程之组播-JSP教程,Java技巧及代码
  • Java数据报之失序和丢包-JSP教程,Java技巧及代码
  • Java数据报编程之概说-JSP教程,Java技巧及代码
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭