1. 程式人生 > >python中的字符串編碼問題——4.unicode編解碼(以實際工作中遇到的韓文編碼為例)

python中的字符串編碼問題——4.unicode編解碼(以實際工作中遇到的韓文編碼為例)

兼容 技術分享 range window下 byte 分享 pos osi eba

韓文unicode編解碼

問題是這樣,工作中遇到有韓文數據出現亂碼,說是unicode碼。
類似這樣:

技術分享圖片
id    name
323    52186863
149    63637538
314    65516863
322    69826863
290    83645668
355    724851956025
397    724862416863
246    9152960052007500
203    836473ab538683507624
216    73ab5676538683507624
183    845b6863553198ce78d0
269    4e54554a5e9c
160 4e5e5e9c 107 4e5e73ab 85 4e5e76d47eca52a0686380ba 336 4e5e90f45f00 464 4e5e90f460bc 289 4e5e9f8b5e9c 430 4eb260bc 296 4eb26863 266 4ed85398529b635e80cc 428 4ed873ab60bc 310 4ed873ab80cc 212 4ed880ba79e6 312 4ef691dc 291 4ef74e5e 324 4ef74ffa 244 4ef7541d5e9c 249 4ef7541d5e9c
247 4ef760d15e9c 250 4ef760d15e9c 183 4ef762cc5e9c 349 4ef76863 151 4ef7699c 239 4ef76ca55e9c 348 4ef773ab 251 4ef77a8d5e9c 252 4ef7854a5e9c 449 4ef791dc5e9c 350 4ef79b425e9c 344 4f194ed85e9c 312 4f194ed86863 191 4f194ed89b42 248 4f195cbf5e9c 288 4f195df180cc
298 4f196863 452 4f1983e960bc 39 4f555088788d 36 4f555088788d538683507624
數據示例

在unicode中,每個韓文字符包含兩個字節,四位16進制表示,下面驗證一下:
linux,python2.7

>>> ‘????‘ #查看韓文字符串,每個韓文字符占3個字節(在utf-8編碼下)
‘\xec\xa0\x84\xeb\x9d\xbc\xeb\x82\xa8\xeb\x8f\x84‘
>>> len(‘????‘)
12

>>> ‘????‘.decode(‘utf-8‘) #將韓文字符串按照utf-8解碼為unicode
u‘\uc804\ub77c\ub0a8\ub3c4‘
>>> len(‘????‘.decode(‘utf-8‘))
4
>>> u‘????‘ #系統默認將按照utf-8解碼
u‘\uc804\ub77c\ub0a8\ub3c4‘
>>> len(u‘????‘)
4
----------------------因此把上述字符串轉換為unicode----------------

>>> kr_code=‘4f555088788d538683507624‘
>>> kr_len=len(kr_code)/4
>>> str_kr=‘‘
>>> for i in range(kr_len): #16進制分組
... str_kr=str_kr+ ‘\u‘+kr_code[i*4:i*4+4]
...
>>> str_kr
‘\\u4f55\\u5088\\u788d\\u5386\\u8350\\u7624‘
>>> kr_tmp=str_kr.decode(‘unicode-escape‘) #轉換為對應的unicode
>>> kr_tmp
u‘\u4f55\u5088\u788d\u5386\u8350\u7624‘
>>>

----------------------將unicode按照utf-8編碼----------------------

>>> print kr_tmp #打印輸出(linux默認按照utf-8編碼)
何傈礙歷薦瘤
>>> kr_tmp.encode(‘utf-8‘) #按照utf-8編碼,打印輸出,
‘\xe4\xbd\x95\xe5\x82\x88\xe7\xa2\x8d\xe5\x8e\x86\xe8\x8d\x90\xe7\x98\xa4‘
>>> print ‘\xe4\xbd\x95\xe5\x82\x88\xe7\xa2\x8d\xe5\x8e\x86\xe8\x8d\x90\xe7\x98\xa4‘
何傈礙歷薦瘤
>>> ‘何傈礙歷薦瘤‘
‘\xe4\xbd\x95\xe5\x82\x88\xe7\xa2\x8d\xe5\x8e\x86\xe8\x8d\x90\xe7\x98\xa4‘

----------------------將unicode按照韓文EUC_KR編碼----------------------

what?為甚麽不是韓文,看來並不是utf-8編碼,猜測韓文編碼EUC_KR,試一下
>>> kr_tmp.encode(encoding=‘EUC_KR‘)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: ‘euc_kr‘ codec can‘t encode character u‘\u5088‘ in position 1: illegal multibyte sequence
----------------------將unicode按照中文GB18030編碼----------------------
>>> #並不是,打印出漢字,難道是漢字編碼?
>>> gb_str=kr_tmp.encode(encoding=‘GB18030‘) #按照GB18030編碼
>>> print gb_str
>>> gb_str
‘\xba\xce\xc0\xfc\xb0\xad\xc0\xfa\xbc\xf6\xc1\xf6‘
>>> print gb_str #linux下按照utf-8無法編碼
????????????
>>> gb_str=kr_tmp.encode(encoding=‘GBK‘) #按照GBK編碼,與GB18030兼容,在window下顯示為中文(GBK)
>>> gb_str
‘\xba\xce\xc0\xfc\xb0\xad\xc0\xfa\xbc\xf6\xc1\xf6‘
>>> print gb_str #linux下按照utf-8無法編碼,在window下顯示為中文(GBK)
????????????
----------------------將unicode按照中文GB18030編碼----------------------
>>> kr_str=gb_str.decode(‘EUC_KR‘) #按照EUC_KR編碼
>>> kr_str
u‘\ubd80\uc804\uac15\uc800\uc218\uc9c0‘
>>> print kr_str #終於輸出了韓文
??????
>>>

總結:
對unicode按照GB18030進行了編碼====>>按照EUC_KR進行了解碼====>>輸出了韓文字符串

分析一下其原始unicode的產生過程:
韓文字符串====>>按照EUC_KR進行了編碼====>>按照GB18030進行了解碼====>>unicode

驗證一下:
>>> u‘??????‘.encode(‘EUC_KR‘).decode(encoding=‘GBK‘)
u‘\u4f55\u5088\u788d\u5386\u8350\u7624‘
>>> print u‘??????‘.encode(‘EUC_KR‘).decode(encoding=‘GBK‘)
何傈礙歷薦瘤
>>> kr_tmp
u‘\u4f55\u5088\u788d\u5386\u8350\u7624‘
>>>

最後:
當外文不能正常顯示,顯示為亂碼(中文),有可能就是編碼錯誤,本篇解決了韓文錯誤顯示成中文的問題。

>>> text=u‘撈撫絕瀾‘.encode(‘GB18030‘).decode(‘euc_kr‘)
>>> text
u‘\uc774\ub984\uc5c6\uc74c‘
>>> print text #unicode
????

>>> u_text= u‘撈撫絕瀾‘.encode(‘gbk‘).decode(‘euc_kr‘).encode(‘utf-8‘)
>>> u_text
‘\xec\x9d\xb4\xeb\xa6\x84\xec\x97\x86\xec\x9d\x8c‘
>>> print u_text #str
????

python中的字符串編碼問題——4.unicode編解碼(以實際工作中遇到的韓文編碼為例)