Oracle存储除中英文其他语种文字时出现乱码

本文介绍如何在Oracle数据库中处理非中文或英文的乱码问题,通过判断字符类型并转换为Unicode,确保跨语言数据的正确存储与显示。提供Java代码示例,包括判断中文、英文的方法以及Unicode编码和解码的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)));

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值