hibernate2 + oracle817 从数据库取出中文乱码,如何解决?

时间:2022-05-24 07:45:54
hibernate2 + oracle817 从数据库取出中文乱码,如何解决? 

是不是在url加什么参数之类的就可以解决?

9 个解决方案

#1


你看看是不是数据库中存的已经是乱码了?
另外注意自己页面的编码格式。

#2


import java.beans.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;

import org.apache.commons.beanutils.*;

public class ObjectBeanUtils {
  public ObjectBeanUtils() {
  }

  /**
    * 对List对象进行转码处理
    * @param List        List对象
    * @return String
   */
  public static void  ObjectConvert(List list){
    if (list==null && ! (list instanceof List)) {
      return ;
    }
    for(int i=0;i<list.size();i++){
      Object co=list.get(i);
      ObjectConvert(co);
    }
  }

  /**
    * 对Iterator对象进行转码处理
    * @param Iterator       iterator对象
    * @return Iterator
   */

  public static Iterator IteratorConvert(Iterator iterator){
    List temp=new ArrayList();
    if (iterator==null && ! (iterator instanceof Iterator)) {
      return null;
    }
    while(iterator.hasNext()){
      Object co=iterator.next();
      ObjectConvert(co);
      temp.add(co);
    }
    return temp.iterator();
  }

  /**
    * 对Object(Class)对象进行转码处理
    * @param o        Object对象
    * @return String
   */
  public static void ObjectConvert(Object o){
    try {
      Map map = BeanUtils.describe(o);
      Set keySet = map.keySet();
      for (Iterator iter = keySet.iterator(); iter.hasNext(); ) {
        Object element = (Object) iter.next();

        PropertyDescriptor desc = PropertyUtils.getPropertyDescriptor(o,
            element.toString());
        Class cl = desc.getPropertyType();
        System.out.print(cl.getName());
        if(cl.equals(String.class)){
          BeanUtils.setProperty(o, element.toString(),  ObjectCharacterConvertChinese(map.get(element)));
        }
      }
    }
    catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    catch (InvocationTargetException e) {
      e.printStackTrace();
    }
    catch (NoSuchMethodException e) {
      e.printStackTrace();
    }
  }

 public static String ObjectCharacterConvertChinese(Object value){
   if (value == null && ! (value instanceof String) ) {
     return "";
   }
   try {
     String temp_p = (String)value;
     byte[] temp_t = temp_p.getBytes("ISO-8859-1");
     String unicode = new String(temp_t, "gbk");
     return unicode;
   }
   catch (UnsupportedEncodingException e) {
     return "";
   }
 }

 public static String ObjectCharacterConvertISO(Object value){
   if (value == null && ! (value instanceof String) ) {
     return "";
   }
   try {
     String temp_p = (String)value;
     byte[] temp_t = temp_p.getBytes("gbk");
     String unicode = new String(temp_t, "ISO-8859-1");
     return unicode;
   }
   catch (UnsupportedEncodingException e) {
     return "";
   }
 }

}
用这个类做转换试试,我在mysql数据库中需要用到这个类,但是oracle9也能解决,但是oracle8没试过

#3


晕。
没有象 mysql 那样,在 url 上加个参数就解决问题的方法吗?

#4


mysql 在连接参数上作文章也只是限于mysql3,mysql4就不行了,这个方法还是挺管用的,而且你还可以采用过滤器

#5


你这样是要在程序的每个角落都要写上转码的调用代码吧?

我是想,是否能在应用程序~数据库间插入一个(一层)东西,使得读数据库内容后先转码再存入entity;写数据库前先将entity内容转码后再存入数据库。


比如使用拦截器。

我能够轻易地做到转码后存入数据库。 onsave方法
可是,我不知如何才能做到取出时转码。

而且,由于我在存入前对对象进行了转码,不知如何在存入后还原

#6


jsp页面上有没有添加
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

#7


实话说,没有见过 Ora 中乱码的——就算有,许多也很好解决。

#8


哦。我是不希望采用硬编码,这样,我在每个和数据打交道的地方都要调用编码函数了

#9


修改注册表。使之变成与你的数据库相对应的字符集。
[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0]"NLS_LANG"="american_america.we8iso8859p1"
比如说以上的是连接数据库字符集为8859的配置

#1


你看看是不是数据库中存的已经是乱码了?
另外注意自己页面的编码格式。

#2


import java.beans.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;

import org.apache.commons.beanutils.*;

public class ObjectBeanUtils {
  public ObjectBeanUtils() {
  }

  /**
    * 对List对象进行转码处理
    * @param List        List对象
    * @return String
   */
  public static void  ObjectConvert(List list){
    if (list==null && ! (list instanceof List)) {
      return ;
    }
    for(int i=0;i<list.size();i++){
      Object co=list.get(i);
      ObjectConvert(co);
    }
  }

  /**
    * 对Iterator对象进行转码处理
    * @param Iterator       iterator对象
    * @return Iterator
   */

  public static Iterator IteratorConvert(Iterator iterator){
    List temp=new ArrayList();
    if (iterator==null && ! (iterator instanceof Iterator)) {
      return null;
    }
    while(iterator.hasNext()){
      Object co=iterator.next();
      ObjectConvert(co);
      temp.add(co);
    }
    return temp.iterator();
  }

  /**
    * 对Object(Class)对象进行转码处理
    * @param o        Object对象
    * @return String
   */
  public static void ObjectConvert(Object o){
    try {
      Map map = BeanUtils.describe(o);
      Set keySet = map.keySet();
      for (Iterator iter = keySet.iterator(); iter.hasNext(); ) {
        Object element = (Object) iter.next();

        PropertyDescriptor desc = PropertyUtils.getPropertyDescriptor(o,
            element.toString());
        Class cl = desc.getPropertyType();
        System.out.print(cl.getName());
        if(cl.equals(String.class)){
          BeanUtils.setProperty(o, element.toString(),  ObjectCharacterConvertChinese(map.get(element)));
        }
      }
    }
    catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    catch (InvocationTargetException e) {
      e.printStackTrace();
    }
    catch (NoSuchMethodException e) {
      e.printStackTrace();
    }
  }

 public static String ObjectCharacterConvertChinese(Object value){
   if (value == null && ! (value instanceof String) ) {
     return "";
   }
   try {
     String temp_p = (String)value;
     byte[] temp_t = temp_p.getBytes("ISO-8859-1");
     String unicode = new String(temp_t, "gbk");
     return unicode;
   }
   catch (UnsupportedEncodingException e) {
     return "";
   }
 }

 public static String ObjectCharacterConvertISO(Object value){
   if (value == null && ! (value instanceof String) ) {
     return "";
   }
   try {
     String temp_p = (String)value;
     byte[] temp_t = temp_p.getBytes("gbk");
     String unicode = new String(temp_t, "ISO-8859-1");
     return unicode;
   }
   catch (UnsupportedEncodingException e) {
     return "";
   }
 }

}
用这个类做转换试试,我在mysql数据库中需要用到这个类,但是oracle9也能解决,但是oracle8没试过

#3


晕。
没有象 mysql 那样,在 url 上加个参数就解决问题的方法吗?

#4


mysql 在连接参数上作文章也只是限于mysql3,mysql4就不行了,这个方法还是挺管用的,而且你还可以采用过滤器

#5


你这样是要在程序的每个角落都要写上转码的调用代码吧?

我是想,是否能在应用程序~数据库间插入一个(一层)东西,使得读数据库内容后先转码再存入entity;写数据库前先将entity内容转码后再存入数据库。


比如使用拦截器。

我能够轻易地做到转码后存入数据库。 onsave方法
可是,我不知如何才能做到取出时转码。

而且,由于我在存入前对对象进行了转码,不知如何在存入后还原

#6


jsp页面上有没有添加
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

#7


实话说,没有见过 Ora 中乱码的——就算有,许多也很好解决。

#8


哦。我是不希望采用硬编码,这样,我在每个和数据打交道的地方都要调用编码函数了

#9


修改注册表。使之变成与你的数据库相对应的字符集。
[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0]"NLS_LANG"="american_america.we8iso8859p1"
比如说以上的是连接数据库字符集为8859的配置