在抽取oracle等數(shù)據(jù)庫(kù)時(shí),由于編碼問(wèn)題需要處理unicode字符串儒恋,將字符串中的特殊符號(hào)和中文還原砖瞧。
例如:如下UNISTR字符串 UNISTR('\FF08Solar-Grade Polysilicn\FF09\591A\6676\7845\6599 \3010\53D7\6258--B\4E13\7528\6599\3011') 需要轉(zhuǎn)換為對(duì)應(yīng)的中英文字符串(Solar-Grade Polysilicn)多晶硅料 【受托--B專(zhuān)用料】
import java.util.regex.Pattern
import scala.util.matching.Regex
/**
* 將帶有unicode的字符串轉(zhuǎn)換為中文字符祷嘶,字符串中的英文字符保持不變
* @param unicode 帶有unicode的字符串宣蠕,支持包含英文的
* @return 轉(zhuǎn)換為原有的中英文字符串
*/
def oracleUnicode2cnUpdate(unicode: String): String = {
val res = if (unicode != null) {
var newStr = unicode.replace("UNISTR('", "").replace("')", "")
val pattern = "\\\\[0-9,a-f,A-F]{4}".r // 正則表達(dá)式, 匹配 ”\后跟四位十六進(jìn)制字符“弥搞,四個(gè)字符必須是代表16位進(jìn)制的字符,比如\3010\81EA\
val matchRes = pattern.findAllIn(newStr) //findAllIn()方法返回遍歷所有匹配項(xiàng)的迭代器
// 每遍歷一下匹配項(xiàng)邮绿,轉(zhuǎn)換并替換原有字符串相應(yīng)位置的unicode,直到所有unicode被轉(zhuǎn)換為中文字符攀例。
for (matchString <- matchRes) {
val unicodeFull = "\\" + matchString // 得到"\\3010", 在replaceAll中需要替換\3010, \前面需要加轉(zhuǎn)義字符才可以替換轉(zhuǎn)義字符本身
val unicodeNum = matchString.replace("\\", "") // 得到四位十六進(jìn)制字符船逮,\3010 => 3010
val newChar = Integer.valueOf(unicodeNum, 16).intValue.toChar // 得到每個(gè)十六位進(jìn)制代表的字符
newStr = newStr.replaceAll(unicodeFull, newChar.toString)
}
newStr
} else null
res
}