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

来源:互联网 发布:unity3d 液体流动 编辑:程序博客网 时间:2024/05/22 03:23

一、问题描述:

   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;

0 0