小语种特殊字符
当遇到html特殊字符需要存入数据库时,数据库不接受。
html特殊字符:https://tool.oschina.net/commons?type=2
方案一:
1 把传入的特殊字符转译
/**
* 把非中文和非中文的()转换成转译字符
* @param name
* @return
*/
public static String covertSpecialCharToHtml(String name){
int length = name.length();
String subName = "";
boolean matches = false;
String covertName = "";
for (int i = 0; i < length; i++) {
subName = name.substring(i, i+1);
matches = subName.matches("[\u4e00-\u9fa5()]");// 判断是否是中文和中文括号
// 中文和中文括号不转译
if (matches) {
covertName += subName;
} else {
covertName += StringEscapeUtils.escapeHtml(subName);
}
}
return covertName;
}
2 把转换过得字符存入数据库
3 转译字符转成原字符,调用
StringEscapeUtils.unescapeHtml(corporationNo);
方案二
1 数据库字段类型设置为 nvarcha2 类型
nvarchar支持utf8特殊字符
2 把字符转换
public static String valueToUnicode(String itemValue){
String unicodeData = "";
String valueString = "";
String finalString = "";
if (!StringUtils.isEmpty(itemValue)) {
for (int i = 0; i < itemValue.length(); i++) {
//遍历字符串,获取每一个的16进制
char c = itemValue.charAt(i);
unicodeData = Integer.toHexString(c);
//判断当前字符的16进制长度,如果是两位16进制,在前面补上两个0。
//如果是单引号(等于27),需要转义,否则sql语句解释失败
if (unicodeData.length() == 2) {
if (unicodeData.equals("27")) {
valueString += "''";
}else{
valueString += "\\00" + unicodeData;
}
} else if(unicodeData.length() == 3) {
valueString += "\\0" + unicodeData;
}else{
//正常的四位16进制长度,直接拼街上
valueString +="\\" + unicodeData + "";
}
}
//使用unistr函数拼接sql语句
finalString = "unistr('" + valueString + "')";
} else {
//如果为空,使用null
finalString = "null";
}
return finalString;
}
调用方法之后,
valueToUnicode(“fdafds”);
返回
unistr(’\0066\0064\0061\0066\0064\0073’) ,
把返回值拼接到sql中,