oracle数据库字符集为ZHS16GBK插入的韩文日文俄文变成问号

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36092584/article/details/80713049
最近项目中解析xml存在中文俄文日文韩文等等乱七八槽的外文,在插入数据库中会乱码变成问号。

原因:是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




猜你喜欢

转载自blog.csdn.net/qq_36092584/article/details/80713049