py2下hbase的字符串編碼問題(\\xe7\\xbc\\x96)

py2下hbase的字符串編碼問題(\xe7\xbc\x96)

最近在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

  1. 這段字符串中包含英文與數字,它們在裏面是直接儲存的,並無被編碼。
  2. \r \n這類的特殊字符是單個字節儲存的,必須區分出來。

因而,只好使用我以爲比較蠢但又迫不得已的辦法,思路以下:字符串

  1. 使用正則,按照三個字節取出
  2. 轉換中文編碼後替換原字符串
  3. 處理特殊字符的編碼

將這兩個坑給填了後,代碼以下: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.定位符使您可以將正則表達式固定到行首或行尾。
複製代碼

需求基本知足了,不過須要注意的是,這裏依然存在幾個問題:

  1. 這段代碼不兼容py3。它的運行環境爲py2,py3下運行是會報錯的。緣由仍是在於他們對字符串編碼的默認處理方式不一樣。
  2. 沒有考慮大小寫。 這裏對字節碼的替換規則默認爲替換大寫的,實際中,它可能存在小寫的狀況。
  3. 特殊字符。 這裏只對常見的\r \n \t進行了處理,實際中,還可能存在\f \v等的狀況。

這裏留下了幾個bug… 有點慚愧,不過正所謂前人挖坑後人填

處理的方式其實也不難,第2點,使用正則來代替replace,第3點,增長\f \v 的處理便可,基本不用修改太多。第1點的話,則可能須要一點時間針對py3下的進行改寫了,不過問題也不大。 :)

相關文章
相關標籤/搜索