Oracle存储除中英文其他语种文字时出现乱码,先看数据库字符集,select userenv(‘language’) from dual;
一般出现乱码,字符集是GBK,如果统一修改字符集可能有风险,建议在对应的表新增一个字段,在存储时将乱码的文本转成UNICode字符,显示的时候在转回原来的形式。
具体,先判断文本是否不是中文或者英文
package com.pcitc.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
public class Language {
//判断是否中文汉字
public static boolean isChinese2(String charaString) {
//boolean result=false;
String regEx = “[\u4e00-\u9fa5]+”;
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(charaString);
if(m.find()) {
return true;
}else {
return false;
}
}
// 判断是不是英文字母
public static boolean isEnglish(String charaString) {
return charaString.matches("^[a-zA-Z]*");
}
}
如果不是则进行转换,转换成Unicode
public static String convert(String str)
{
str = (str == null ? “” : str);
String tmp;
StringBuffer sb = new StringBuffer(1000);
char c;
int i, j;
sb.setLength(0);
for (i = 0; i < str.length(); i++)
{
c = str.charAt(i);
sb.append("\u");
j = (c >>>8); //取出高8位
tmp = Integer.toHexString(j);
if (tmp.length() == 1)
sb.append(“0”);
sb.append(tmp);
j = (c & 0xFF); //取出低8位
tmp = Integer.toHexString(j);
if (tmp.length() == 1)
sb.append(“0”);
sb.append(tmp);
}
return (new String(sb));
}
回写时,将Unicode在转回成要来的形式
// unicode 转字符串
public static String unicode2String(String unicode) {
StringBuffer string = new StringBuffer();
String[] hex = unicode.split("\\u");
for (int i = 1; i < hex.length; i++) {
// 转换出每一个代码点
int data = Integer.parseInt(hex[i], 16);
// 追加成string
string.append((char) data);
}
return string.toString();
}
public static void main(String[] args) {
String str = “MARSAN TEKSTİL İŞLETMELERİ SANAYİ”;
// str ="\u004e\u0041\u004c\u0049\u0053\u0020\u002d\u0020\u0049\u004e\u0044\u00da\u0053\u0054\u0052\u0049\u0041\u0020\u0045\u0020\u0043\u004f\u004d\u00c9\u0052\u0043\u0049\u004f";
// System.out.println(convert(str));
// System.out.println(string2Unicode(str));
System.out.println(unicode2String("\u004e\u0041\u004c\u0049\u0053\u0020\u002d\u0020\u0049\u004e\u0044\u00da\u0053\u0054\u0052\u0049\u0041\u0020\u0045\u0020\u0043\u004f\u004d\u00c9\u0052\u0043\u0049\u004f"));
// System.out.println(convert(str).length());
// System.out.println(unicode2String(string2Unicode(str)));
}