正则表达式解析包含中英文的unicode字符串

在抽取oracle等数据库时,由于编码问题需要处理unicode字符串,将字符串中的特殊符号和中文还原。
例如:如下UNISTR字符串 UNISTR('\FF08Solar-Grade Polysilicn\FF09\591A\6676\7845\6599 \3010\53D7\6258--B\4E13\7528\6599\3011') 需要转换为对应的中英文字符串(Solar-Grade Polysilicn)多晶硅料 【受托--B专用料】

import java.util.regex.Pattern
import scala.util.matching.Regex
/**
   * 将带有unicode的字符串转换为中文字符,字符串中的英文字符保持不变
   * @param unicode  带有unicode的字符串,支持包含英文的
   * @return 转换为原有的中英文字符串
   */
  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 // 正则表达式, 匹配 ”\后跟四位十六进制字符“,四个字符必须是代表16位进制的字符,比如\3010\81EA\
      val matchRes = pattern.findAllIn(newStr) //findAllIn()方法返回遍历所有匹配项的迭代器
      // 每遍历一下匹配项,转换并替换原有字符串相应位置的unicode,直到所有unicode被转换为中文字符。
      for (matchString <- matchRes) {
        val unicodeFull = "\\" + matchString // 得到"\\3010",  在replaceAll中需要替換\3010, \前面需要加转义字符才可以替换转义字符本身
        val unicodeNum = matchString.replace("\\", "") // 得到四位十六进制字符,\3010 => 3010
        val newChar = Integer.valueOf(unicodeNum, 16).intValue.toChar // 得到每个十六位进制代表的字符
        newStr = newStr.replaceAll(unicodeFull, newChar.toString)
      }
      newStr
    } else null
    res
  }

你可能感兴趣的:(正则表达式解析包含中英文的unicode字符串)