python中的字符串编码问题——4.unicode编解码(以实际工作中遇到的韩文编码为例)
Posted 米仓山下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的字符串编码问题——4.unicode编解码(以实际工作中遇到的韩文编码为例)相关的知识,希望对你有一定的参考价值。
韩文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编码下)
‘xecxa0x84xebx9dxbcxebx82xa8xebx8fx84‘
>>> len(‘????‘)
12
>>> ‘????‘.decode(‘utf-8‘) #将韩文字符串按照utf-8解码为unicode
u‘uc804ub77cub0a8ub3c4‘
>>> len(‘????‘.decode(‘utf-8‘))
4
>>> u‘????‘ #系统默认将按照utf-8解码
u‘uc804ub77cub0a8ub3c4‘
>>> 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‘u4f55u5088u788du5386u8350u7624‘
>>>
----------------------将unicode按照utf-8编码----------------------
>>> print kr_tmp #打印输出(linux默认按照utf-8编码)
何傈碍历荐瘤
>>> kr_tmp.encode(‘utf-8‘) #按照utf-8编码,打印输出,
‘xe4xbdx95xe5x82x88xe7xa2x8dxe5x8ex86xe8x8dx90xe7x98xa4‘
>>> print ‘xe4xbdx95xe5x82x88xe7xa2x8dxe5x8ex86xe8x8dx90xe7x98xa4‘
何傈碍历荐瘤
>>> ‘何傈碍历荐瘤‘
‘xe4xbdx95xe5x82x88xe7xa2x8dxe5x8ex86xe8x8dx90xe7x98xa4‘
----------------------将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
‘xbaxcexc0xfcxb0xadxc0xfaxbcxf6xc1xf6‘
>>> print gb_str #linux下按照utf-8无法编码
????????????
>>> gb_str=kr_tmp.encode(encoding=‘GBK‘) #按照GBK编码,与GB18030兼容,在window下显示为中文(GBK)
>>> gb_str
‘xbaxcexc0xfcxb0xadxc0xfaxbcxf6xc1xf6‘
>>> print gb_str #linux下按照utf-8无法编码,在window下显示为中文(GBK)
????????????
----------------------将unicode按照中文GB18030编码----------------------
>>> kr_str=gb_str.decode(‘EUC_KR‘) #按照EUC_KR编码
>>> kr_str
u‘ubd80uc804uac15uc800uc218uc9c0‘
>>> print kr_str #终于输出了韩文
??????
>>>
总结:
对unicode按照GB18030进行了编码====>>按照EUC_KR进行了解码====>>输出了韩文字符串
分析一下其原始unicode的产生过程:
韩文字符串====>>按照EUC_KR进行了编码====>>按照GB18030进行了解码====>>unicode
验证一下:
>>> u‘??????‘.encode(‘EUC_KR‘).decode(encoding=‘GBK‘)
u‘u4f55u5088u788du5386u8350u7624‘
>>> print u‘??????‘.encode(‘EUC_KR‘).decode(encoding=‘GBK‘)
何傈碍历荐瘤
>>> kr_tmp
u‘u4f55u5088u788du5386u8350u7624‘
>>>
最后:
当外文不能正常显示,显示为乱码(中文),有可能就是编码错误,本篇解决了韩文错误显示成中文的问题。
>>> text=u‘捞抚绝澜‘.encode(‘GB18030‘).decode(‘euc_kr‘)
>>> text
u‘uc774ub984uc5c6uc74c‘
>>> print text #unicode
????
>>> u_text= u‘捞抚绝澜‘.encode(‘gbk‘).decode(‘euc_kr‘).encode(‘utf-8‘)
>>> u_text
‘xecx9dxb4xebxa6x84xecx97x86xecx9dx8c‘
>>> print u_text #str
????
以上是关于python中的字符串编码问题——4.unicode编解码(以实际工作中遇到的韩文编码为例)的主要内容,如果未能解决你的问题,请参考以下文章
编码问题:解码Python中的Quoted-Printable字符串
python中的字符串编码问题——2.理解ASCII码ANSI码Unicode编码UTF-8编码
python中的字符串编码问题——3.各操作系统下的不同编码方式