• 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
    이름없음

  • 相关阅读:
    SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)
    SQL Server 多实例下的复制
    SQL Server 批量主分区备份(Multiple Jobs)
    SQL Server 批量完整备份
    SQL Server 游标运用:鼠标轨迹字符串分割
    SQL Server 批量主分区备份(One Job)
    SQL Server 即时文件初始化
    (原+转)Ubuntu中设置程序可用的cpu核心
    (原)Non-local Neural Networks
    (原)softmax loss特征为何径向放射状分布(直观理解,非公式推导。。。)
  • 原文地址:https://www.cnblogs.com/Micang/p/9733036.html
Copyright © 2020-2023  润新知