java解决对US7ASCII编码的ORACLE数据库数据解码

19 篇文章 0 订阅
2 篇文章 0 订阅

一、问题描述:

   1oracle数据库中的数据是以US7ASCII编码集保存的,用程序读取时中文出现乱码现象。

   2、系统中设置的NLS_LANG变量对程序数据库操作没有影响,只对plsql devnavicat这些客户端有用。

二、问题分析:

   1、程序默认使用的编码是系统的默认编码,但开发工具使用的编码集可能与系统不同,JDBC使用的编码与代码字符集一致,如下的GBK就是开发工具的编码。成功。

三、解决办法:

   1、对单个字段使用String的方法在转码后构造一个新字段。

      newString(filed.getBytes("ISO-8859-1"),"GBK")

   2、使用指定字符集对所有字符进行解码。输入LIST对象、解码集和编码集。

   /**

  *对数据库返回数据进行集体解码

  * @param obj

  * @param origCode

  * @param desCode

  * @return

  */

 public List decodeObj(Object obj,StringorigCode,String desCode){

  if(obj instanceof List){

  List objList= (List) obj;

  for(ObjecttempObj:objList){

    PropertyDescriptor[] properties =PropertyUtils.getPropertyDescriptors(tempObj.getClass());

    for(int i=0;i<properties.length;i++){

     String name = properties[i].getName();

     if("class".equals(name)){

     continue;

     }

     try {

     Class classType =PropertyUtils.getPropertyType(tempObj, name);

    if(classType.equals(String.class) //对所有string类型进行转码

     &&PropertyUtils.isReadable(tempObj, name)

     &&PropertyUtils.isWriteable(tempObj, name)){

     Object value =PropertyUtils.getSimpleProperty(tempObj, name);

     if(value!=null){

      try {

       PropertyUtils.setProperty(tempObj,name, new String(((String)value).getBytes(origCode),desCode));

      } catch (UnsupportedEncodingException e) {

       e.printStackTrace();

      }

     }

     }

    } catch (IllegalAccessException | InvocationTargetException

     | NoSuchMethodException e) {

     //根据对象反射,不会出现错误

    }

    }

  }

  }

  return (List) obj;

 }

 3、使用指定字符集对所有输入字符集进行编码,顺序和编码相反。

   /**

  *对数据库的条件参数进行编码。

  * @param map

  * @param origCode

  * @param desCode

  * @return

  */

 public Map<String, Object>encode(Map<String, Object> map,String origCode,String desCode){

  if(map.size()>0){

  for(Stringkey:map.keySet()){

   Object value= map.get(key);

   if(valueinstanceof String){

    if(value!=null){

     try {

     map.put(key, newString(((String)value).getBytes(origCode),desCode));

     } catch (UnsupportedEncodingException e) {

     e.printStackTrace();

     }

    }

   }

  }

  }

  return map;

 }

    4LIST输出的时候调用decodeObj,条件输入的时就汉字就调用encode.

   


  5PropertyUtils来至org.apache.commons.beanutils.PropertyUtils;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值