一、问题描述:
1、oracle数据库中的数据是以US7ASCII编码集保存的,用程序读取时中文出现乱码现象。
2、系统中设置的NLS_LANG变量对程序数据库操作没有影响,只对plsql dev和navicat这些客户端有用。
二、问题分析:
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;
}
4、LIST输出的时候调用decodeObj,条件输入的时就汉字就调用encode.
5、PropertyUtils来至org.apache.commons.beanutils.PropertyUtils;