最近在py2的環境下使用hbase,遇到了一個使人惱火的編碼問題。問題字符串以下:python
'\\XE6\\X89\\X80\\XE8\\XB0\\X93\\XE7\\X89\\XB9\\XE6\\XAE\\X8A\\XE5\\XAD\\X97\\XE7\\XAC\\XA6\\XEF\\XBC\\X8C\\XE5\\XB0\\XB1\\XE6\\X98\\XAF\\XE4\\XB8\\X80\\XE4\\XBA\\X9B\\XE6\\X9C\\X89\\XE7\\X89\\XB9\\XE6\\XAE\\X8A\\XE5\\X90\\XAB\\XE4\\XB9\\X89\\XE7\\X9A\\X84\\XE5\\XAD\\X97\\XE7\\XAC\\XA6\\X0D\\X0A2.\\XE5\\XAE\\X9A\\XE4\\XBD\\X8D\\XE7\\XAC\\XA6\\XE4\\XBD\\XBF\\XE6\\X82\\XA8\\XE8\\X83\\XBD\\XE5\\XA4\\X9F\\XE5\\XB0\\X86\\XE6\\XAD\\XA3\\XE5\\X88\\X99\\XE8\\XA1\\XA8\\XE8\\XBE\\XBE\\XE5\\XBC\\X8F\\XE5\\X9B\\XBA\\XE5\\XAE\\X9A\\XE5\\X88\\XB0\\XE8\\XA1\\X8C\\XE9\\XA6\\X96\\XE6\\X88\\X96\\XE8\\XA1\\X8C\\XE5\\XB0\\XBE\\XE3\\X80\\X82'
複製代碼
這是一段utf-8編碼後的字符串,由三個字節組成一箇中文。正則表達式
比較坑的地方是在它每一個字節碼前的雙反斜槓\\
編碼
一開始,我但願將它的反斜槓去掉一個,而後就能夠交給py本身來處理了,然而因爲反斜槓的轉義,嘗試了多種方式,未果。(難受.jpg)spa
在查詢了網上的一些處理方法後,發現基本都是按照三個字節來取,而後作轉碼。code
可是這裏存在的幾個坑:utf-8
\r
\n
這類的特殊字符是單個字節儲存的,必須區分出來。因而,只好使用我以爲比較蠢但又迫不得已的辦法,思路以下:字符串
將這兩個坑給填了後,代碼以下:string
import re
rule = "\\\\X\w{2}\\\\X\w{2}\\\\X\w{2}"
words = re.findall(rule, var)
for t in words:
new_txt = t.replace('\\X', '').decode('hex')
var = var.replace(t, new_txt)
var = var.replace('\\X0D', '\r').replace('\\X0A', '\n').replace('\\X09', '\t')
複製代碼
這段代碼比較簡單:
rule
是正則的提取規則,按照三個字節提取,去除可能存在的單字節特殊字符
var
是須要處理的字符串
new_txt
是咱們須要的中文
第7行
是使用中文替換掉原始的字節碼 第8行
是處理可能存在的指標符class
使用這段代碼轉換上文的那段字符後,獲得的結果以下:import
所謂特殊字符,就是一些有特殊含義的字符
2.定位符使您可以將正則表達式固定到行首或行尾。
複製代碼
需求基本知足了,不過須要注意的是,這裏依然存在幾個問題:
\r
\n
\t
進行了處理,實際中,還可能存在\f
\v
等的狀況。這裏留下了幾個bug… 有點慚愧,不過正所謂前人挖坑後人填。
處理的方式其實也不難,第2點,使用正則來代替replace,第3點,增長\f
\v
的處理便可,基本不用修改太多。第1點的話,則可能須要一點時間針對py3下的進行改寫了,不過問題也不大。 :)