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编码下)
'\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编解码(以实际工作中遇到的韩文编码为例)的更多相关文章
- unicode 编解码记录
unicode 万国码.世界上所有的符号都有对应的Unicode code point.一般是2个字节. 这个字节可以通过任意中方式编码为二进制,例如用来保存到文件.一般通过UTF-x(例如utf-8 ...
- Android中使用commons-codec-1.6.jar 进行Base64编解码出现的问题
编码时出现异常: java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String; in c ...
- 中文unicode范围及unicode编解码
中文unicode范围 : [\u4e00-\u9fa5] 普通字符串可以用多种方式编码成Unicode字符串,具体要看你究竟选择了哪种编码:unicodestring = u"Hello ...
- 音视频编解码: YUV采样格式中的YUV444,YUV422,YUV420理解
YUV各种采样格式的说明 通常我们用RGB表示一种彩色.计算机系统里的LCD显示的数据就是RGB来表示每个像素的颜色.而在我们生活里,有黑白电视机与彩色电视机两种,拍摄节目源时不可以用两种不同的摄像机 ...
- 【Python】使用内置base64模块进行编解码
代码: import hashlib import base64 hash = hashlib.md5() hash.update('逆火Tu22m'.encode('utf-8')) print(h ...
- python学习笔记——字符串
类方法string.upper(str)需要引入string模块,实例方法str.upper()不需要引入string模块 无与伦比的列表解析功能 # coding=utf-8 # 列表解析 prin ...
- JAVA字符编码二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换 1.函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有 ...
- 如何将Unicode文本写到日志文件中
有时为了定位问题,我们需要结合打印日志来处理.特别是较难复现的,一般都需要查看上下文日志才能找出可能存在的问题.考虑到程序要在不同语言的操作系统上运行,程序界面显示要支持Unicode,打印出来的日志 ...
- php大力力 [024节]PHP中的字符串连接操作(2015-08-27)
2015-08-27 php大力力024.PHP中的字符串连接操作 PHP中的字符串连接操作 阅读:次 时间:2012-03-25 PHP字符串的连接的简单实例 时间:2013-12-30 很多 ...
随机推荐
- (转) centos7下创建mysql5.6多实例
原文:http://blog.csdn.net/a1010256340/article/details/77483504 一.mysql安装目录说明mysql5.6以二进制安装包安装在/data/my ...
- (转)测试rootvg卷组的镜像的官方做法
测试rootvg卷组的镜像的官方做法 这篇文档介绍了测试rootvg卷组镜像的方法,此文档仅使用于带有热插拔硬盘的pSeries服务器.由于rootvg卷组包含有AIX操作系统,在做卷组镜像配置上比非 ...
- C# 终极基类Object介绍
一.简介 Object这个类型,相信everyone都不陌生,这个是CLR定义的最基础的类型,俗称"上帝类".CLR(运行时)要求所有类型,不管是系统定义的类型还是自定义的类型,都 ...
- [webrtc] 强制使用tcp传输
以前笔记,整理 webrtc默认使用UDP传输,但是也可以通过TCP传输. 使用tcp传输,需要服务器中转,turnserver,licode,janus之类的服务器. 1. 如果使用turnserv ...
- Linux的管道命令
Linux的管道命令 管道命令(Pipe) 管道命令用"|"来表示,管道命令需要接收前一个命令的输出来进行操作,但不能处理前一个命令的错误. //选取界面:cut,grep cut ...
- scss 入门
scss 入门 1. scss 引入其他文件 引入其他 .scss 文件 @import 'index.scss' 这样的话,文件在编译后,会自动把引入的文件和当前文件合并为一个. scss 文件 引 ...
- SourceTree跳过Atlassian账号,免登陆,跳过初始设置
SourceTree 安装之后需要使用账号登陆以授权,并且是强制登陆. 登录过程非常漫长,并未在不FQ的情况下是不能成功的,下面记录一下跳过登录的方法. 装之后,转到用户本地文件夹下的 SourceT ...
- sql 保留两位小数
select convert(decimal(18,2),1800.2669)
- 广州.NET俱乐部简介
广州.NET俱乐部 简介 广州 .NET 俱乐部自2018年底重新在广州地区活跃. 目前已经成功在广州.深圳.苏州和东莞组织并参与了多长线下技术交流活动. 已经有超过1200+人加入了俱乐部线上社区. ...
- 数据库-转换sql语句
文章描述:主要说明转换成SQL语句的过程.----必要信息(数据库名,表名,条件)转换成SQL语句 一些界面上数据增删改查的操作往往只需要输入一数据库名,表名,加条件就可以进行数据查询了,在这背后是怎 ...