最近项目中解析xml存在中文俄文日文韩文等等乱七八槽的外文,在插入数据库中会乱码变成问号。
create or replace function 函数名(参数)
原因:是oracle安装的数据库的时候字符集不一样( select userenv('language') from dual可以查看),SIMPLIFIED CHINESE_CHINA.ZHS16GBK这种会变成问号,而SIMPLIFIED CHINESE_CHINA.AL32UTF8这种字符集却可以正常保存。
尝试了网上的一些修改环境变量NLS_LANG,以及用nvchar的oracle数据类型却都不行,存到数据库都乱码。最后就只能通过将外文内容转成十六进制的字节码,最后读取查询的时候再将字节码转成原来的内容就行。
public class Test {
// 字符串转换unicode
public static String string2Unicode(String string) {
StringBuffer unicode = new StringBuffer();
for (int i = 0; i < string.length(); i++) {
// 取出每一个字符
char c = string.charAt(i);
// 转换为unicode
unicode.append("\\u" + Integer.toHexString(c));
}
return unicode.toString();
}
// 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 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));
}
public static void main(String[] args) {
String str = "???";
System.out.println(convert(str));
System.out.println(string2Unicode(str));
System.out.println(unicode2String(convert(str)));
System.out.println(unicode2String(string2Unicode(str)));
}
}
// \ub9ac\uad11\uadfc 输出结果
// \ub9ac\uad11\uadfc
// 리광근
// 리광근
但是我们项目这边用的是JS查询,封装的内部框架,不是去请求Java,所以需要用SQL的函数Function实现oracle函数unistr将Oracle数据库中的Unicode转换为原文
CREATE OR REPLACE FUNCTION UnicodeToString(v_unicode_str varchar2)
RETURN nvarchar2 AS
v_str nvarchar2(1000) :='';
BEGIN
begin
select unistr(REPLACE(v_unicode_str,'\u','\')) into v_str from dual ;
exception
when others then
v_str := '';
end;
RETURN v_str;
END UnicodeToString;
函数Function说明:
create or replace function 函数名(参数)
return 返回值类型 as
定义变量
begin 函数主体 end
函数Function调用:(sql语句,instr判断有没有包含\u)
(case
when instr(internationalname, '\u') = 1 then
UnicodeToString(internationalname)
else
internationalname
end) as internationalname