亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java數據庫字符國際化

2019-11-18 12:10:44
字體:
來源:轉載
供稿:網友

  數據庫字符國際化是大家提問最多的問題,例如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));

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲二区| 亚洲欧美另类中文字幕| 影音先锋欧美精品| 欧美久久精品一级黑人c片| 国产精品九九九| 人九九综合九九宗合| 一区二区三区无码高清视频| 中文综合在线观看| 日韩精品极品视频免费观看| 91精品国产综合久久香蕉| 亚洲成年人在线| 一本一本久久a久久精品综合小说| 国产欧美一区二区| 日韩经典第一页| 中文字幕亚洲二区| 日韩高清av在线| 这里只有精品丝袜| 韩国精品久久久999| 欧美国产精品人人做人人爱| 国产男人精品视频| 日本aⅴ大伊香蕉精品视频| 亚洲电影免费观看高清完整版| 国产精品成人aaaaa网站| 日韩大陆欧美高清视频区| 欧美激情国产高清| 亚洲在线免费观看| 伊人青青综合网站| 亚洲电影第1页| 亚洲人成网站999久久久综合| 亚洲第一精品夜夜躁人人躁| 久久青草精品视频免费观看| 成人免费午夜电影| 久久久久久亚洲精品不卡| 日本久久久久久久| 亚洲精品丝袜日韩| 日韩精品免费在线播放| 亚洲三级黄色在线观看| 尤物精品国产第一福利三区| 中文字幕av一区二区三区谷原希美| 69**夜色精品国产69乱| 日韩一区二区三区国产| 欧美日韩福利在线观看| 2024亚洲男人天堂| 成人国产在线激情| 欧美丰满老妇厨房牲生活| 国a精品视频大全| 久久亚洲精品中文字幕冲田杏梨| 亚洲有声小说3d| 久久视频在线视频| 午夜精品久久久久久久久久久久久| 国产精品免费看久久久香蕉| 国产精品美女www爽爽爽视频| 亚洲综合日韩在线| 久久久av一区| 97国产精品视频| 日韩经典中文字幕| 亚洲国产精品大全| 日韩欧美极品在线观看| 日韩女优人人人人射在线视频| 黑人精品xxx一区一二区| 中文字幕欧美国内| 欧美一区第一页| 国产精品久久久久国产a级| 国产精品久久久久77777| 欧美激情2020午夜免费观看| 欧美激情精品久久久久| 亚洲日韩第一页| 精品久久久久久久大神国产| 欧美激情国产高清| 精品国产乱码久久久久久天美| 久久精品国产91精品亚洲| 国产午夜精品美女视频明星a级| 欧美肥老太性生活视频| 亚洲欧洲在线观看| 日本午夜精品理论片a级appf发布| 一区二区三区天堂av| 久久成人精品一区二区三区| 亚洲iv一区二区三区| 国产在线精品成人一区二区三区| 欧美成人性色生活仑片| 国产视频在线观看一区二区| 久久亚洲欧美日韩精品专区| 国产精品99久久久久久久久久久久| 国产在线精品成人一区二区三区| 午夜精品一区二区三区视频免费看| 亚洲free性xxxx护士白浆| 97人洗澡人人免费公开视频碰碰碰| 国产一区二区三区在线| 亚洲人成77777在线观看网| 亚洲午夜激情免费视频| 美女久久久久久久久久久| 国产精品久久久久久久久免费| 亚洲欧美在线x视频| 欧美精品免费看| 久久久免费精品视频| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲国产又黄又爽女人高潮的| 久久偷看各类女兵18女厕嘘嘘| 久久久亚洲成人| 国产伦精品一区二区三区精品视频| 97精品国产aⅴ7777| 欧美国产日韩在线| 成人亚洲综合色就1024| 国产欧美一区二区三区在线看| 福利视频第一区| 欧美成人精品h版在线观看| 中文字幕日韩精品在线观看| 高清欧美性猛交xxxx黑人猛交| 深夜福利91大全| 国产99久久精品一区二区| 欧美日韩中文字幕在线| 国产精品狠色婷| 欧美日韩加勒比精品一区| 中文字幕亚洲精品| 国产精品高清在线| 国产91在线播放九色快色| 国产精品久久久一区| 国外色69视频在线观看| 91爱视频在线| 久久久综合免费视频| 国产91热爆ts人妖在线| 欧美成人精品一区二区三区| 国产日韩在线播放| 91在线视频导航| 久热精品视频在线免费观看| x99av成人免费| 亚洲视频在线免费看| 国产97人人超碰caoprom| 91久久久久久久久| 九九精品视频在线观看| 精品久久久久久亚洲国产300| 91最新国产视频| 国产精品亚洲激情| 日韩av电影在线网| 国产精品精品一区二区三区午夜版| 精品福利在线看| 日本一区二区三区在线播放| 97热精品视频官网| 狠狠久久亚洲欧美专区| 精品久久久久久电影| 91精品国产乱码久久久久久久久| 懂色aⅴ精品一区二区三区蜜月| 欧美日韩国产中文字幕| 欧美激情a∨在线视频播放| 午夜精品久久久久久久白皮肤| 孩xxxx性bbbb欧美| 亚洲国产精品久久久久久| 国产精品亚洲自拍| 亚洲第一综合天堂另类专| 欧美激情伊人电影| 亚洲欧美另类国产| 欧美性在线视频| 国产做受69高潮| 中文字幕av一区| 欧美日韩国产成人高清视频| 最近2019中文字幕mv免费看| 国产成人精品在线播放| 九色成人免费视频| 亚洲欧美日韩中文在线| 亚洲男人7777| 亚洲色图第一页| 狠狠躁夜夜躁久久躁别揉| 九九精品在线播放| 精品女同一区二区三区在线播放|