UIF为什么非洲鬣狗攻击人类吗类

玩转Python让人讨厌的编码问题
的编码问题基本是每个新手都会遇到的坎,但只要完全掌握了就跳过了这个坑,万变不离其中,这不最近我也遇到了这个问题,来一起看看吧。
事情的起因是review同事做的一个上传功能,看下面一段代码,self.fp是上传的文件句柄
fpdata = [line.strip().decode('gbk').encode('utf-8').decode('utf-8') for line in self.fp]
data = [''.join(['(', self.game, ',', ','.join(map(lambda x: &'%s'& % x, d.split(','))), ')']) for d in fpdata[1:]]
这段代码暴露了2个问题
1.默认编码使用gbk,为什么不用utf8?
2..encode(&utf-8&).decode(&utf-8&)完全没有必要,decode(&gbk&)之后就已经是unicode了
我建议上传文本编码为utf8,于是代码变成这样?
fpdata = [line.strip() for line in self.fp if line.strip()]
data = [''.join(['(', self.game, ',', ','.join(map(lambda x: &'%s'& % x, d.split(','))), ')']) for d in fpdata[1:]]
可测试时报UnicodeDecodeError: &ascii& codec can&t decode byte 0xe4 in position 0: ordinal not in range(128),这个异常估计新手看到很头疼,这是什么意思呢?
就是说:在将ascii字符串decode为unicode时碰到了oxe4这个比特,这不在ascii的范围内,所有decode错误。
交代一下项目背景,我们用Python2.7,这是django工程,self.game是unicode对象,明白人一看就是sys.setdefaultencoding的问题,其实就是下面这个问题
哎呀,可我明明在settings.py中设置默认编码了呀,查看了一下,才发现闹了个笑话
看看到底发生了什么?由于fpdata都是utf8字符串,而self.game是unicode对象,字符串join时会将utf8字符串解码为unicode对象,但系统不知道你是utf8编码,默认使用ascii去解码,这出错也就不足为奇了。
这也是为什么在碰到编码问题时,老手建议增加sys.setdefaultencoding(&utf8&)操作,但为什么要加这么一个操作呢?我们从底层看看发生了什么?
当字符串连接unicode对象时,也就是a+b时,会调用PyString_Concat
# stringobject.c
PyString_Concat(register PyObject **pv, register PyObject *w)
register PyObject *v;
if (*pv == NULL)
if (w == NULL || !PyString_Check(*pv)) {
Py_CLEAR(*pv);
v = string_concat((PyStringObject *) *pv, w);
Py_DECREF(*pv);
static PyObject *
string_concat(register PyStringObject *a, register PyObject *bb)
register Py_ssize_
register PyStringObject *
if (!PyString_Check(bb)) {
if (PyUnicode_Check(bb))
return PyUnicode_Concat((PyObject *)a, bb);
if (PyByteArray_Check(bb))
return PyByteArray_Concat((PyObject *)a, bb);
PyErr_Format(PyExc_TypeError,
&cannot concatenate 'str' and '%.200s' objects&,
Py_TYPE(bb)-&tp_name);
return NULL;
如果检测到b是unicode对象,会调用PyUnicode_Concat
PyObject *PyUnicode_Concat(PyObject *left,
PyObject *right)
PyUnicodeObject *u = NULL, *v = NULL, *w;
/* Coerce the two arguments */
u = (PyUnicodeObject *)PyUnicode_FromObject(left);
v = (PyUnicodeObject *)PyUnicode_FromObject(right);
w = _PyUnicode_New(u-&length + v-&length);
Py_DECREF(v);
return (PyObject *)w;
PyObject *PyUnicode_FromObject(register PyObject *obj)
if (PyUnicode_Check(obj)) {
/* For a Unicode subtype that's not a Unicode object,
return a true Unicode object with the same data. */
return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(obj),
PyUnicode_GET_SIZE(obj));
return PyUnicode_FromEncodedObject(obj, NULL, &strict&);
由于a不是unicode对象会调用PyUnicode_FromEncodedObject将a转换为unicode对象,传递的编码是NULL
PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,
const char *encoding,
const char *errors)
const char *s = NULL;
PyObject *v;
/* Coerce object */
if (PyString_Check(obj)) {
s = PyString_AS_STRING(obj);
len = PyString_GET_SIZE(obj);
/* Convert to Unicode */
v = PyUnicode_Decode(s, len, encoding, errors);
PyObject *PyUnicode_Decode(const char *s,
Py_ssize_t size,
const char *encoding,
const char *errors)
PyObject *buffer = NULL, *
if (encoding == NULL)
encoding = PyUnicode_GetDefaultEncoding();
/* Shortcuts for common default encodings */
if (strcmp(encoding, &utf-8&) == 0)
return PyUnicode_DecodeUTF8(s, size, errors);
else if (strcmp(encoding, &latin-1&) == 0)
return PyUnicode_DecodeLatin1(s, size, errors);
else if (strcmp(encoding, &ascii&) == 0)
return PyUnicode_DecodeASCII(s, size, errors);
/* Decode via the codec registry */
buffer = PyBuffer_FromMemory((void *)s, size);
if (buffer == NULL)
unicode = PyCodec_Decode(buffer, encoding, errors);
我们看到当encoding是NULL时,encoding是PyUnicode_GetDefaultEncoding(),其实这个就是我们sys.getdefaultencoding()的返回值,Python默认就是ascii
static char unicode_default_encoding[100 + 1] = &ascii&;
const char *PyUnicode_GetDefaultEncoding(void)
return unicode_default_
这里unicode_default_encoding是个静态变量,且分配了足够的空间让你指定不同的编码,估计100个字符肯定是够了
我们在看看sys模块的getdefaultencoding和setdefaultencoding
static PyObject *
sys_getdefaultencoding(PyObject *self)
return PyString_FromString(PyUnicode_GetDefaultEncoding());
static PyObject *
sys_setdefaultencoding(PyObject *self, PyObject *args)
if (PyUnicode_SetDefaultEncoding(encoding))
return NULL;
Py_INCREF(Py_None);
return Py_N
PyUnicode_SetDefaultEncoding不用想也知道设置unicode_default_encoding数组就可以了,Python用的是strncpy
int PyUnicode_SetDefaultEncoding(const char *encoding)
PyObject *v;
/* Make sure the encoding is valid. As side effect, this also
loads the encoding into the codec registry cache. */
v = _PyCodec_Lookup(encoding);
if (v == NULL)
Py_DECREF(v);
strncpy(unicode_default_encoding,
sizeof(unicode_default_encoding) - 1);
return -1;
之前我们在sys.setdefaultencoding(&utf8&)时是reload(sys)的,这是因为在Python site.py中有这么一个操作
if hasattr(sys, &setdefaultencoding&):
del sys.setdefaultencoding
当然你完全可以定制site.py,修改setencoding,使用locale的设置,也就是将if 0修改为if 1。一般windows的设置locale编码为cp936,服务器一般都是utf8
def setencoding():
&&&Set the string encoding used by the Unicode implementation.
default is 'ascii', but if you're willing to experiment, you can
change this.&&&
encoding = &ascii& # Default value set by _PyUnicode_Init()
# Enable to support locale aware default string encodings.
import locale
loc = locale.getdefaultlocale()
if loc[1]:
encoding = loc[1]
# Enable to switch off string to Unicode coercion and implicit
# Unicode to string conversion.
encoding = &undefined&
if encoding != &ascii&:
# On Non-Unicode builds this will raise an AttributeError...
sys.setdefaultencoding(encoding) # Needs Python Unicode build !
所以Python的编码是不难的,
要想玩转Python的编码你需要知道
1.unicode与utf8,gbk的区别,以及unicode与具体编码的转换
2.字符串与unicode连接时会转换为unicode, str(unicode)会转换为字符串
3.当不知道具体编码会使用默认编码ascii,可通过sys.setdefaultencoding修改
如果能解释下面现象应该就能玩转Python让人讨厌的编码问题这些人刚上完新闻联播 就被蔡当局抓了_笨笨-B站_趣味视频集
这些人刚上完新闻联播 就被蔡当局抓了
日 08:44 来源:
  市场上的机油可以分为:
  合成数码宝贝,强化能力的“数码实验室”
  当前A股市场走势将如何演绎,谨慎投资者认为,当前A股市场成交量相对低迷,监管力度加大,短线市场波幅有可能进一步放大。
  玲珑别致的校园,大大小小的文化宣传牌,特别是梁瑞校长讲解的办学理念、办学特色等给在座的各位领导、老师以耳目一新的感觉。紧接着,各校领导、老师就学校标准化建设国检中出现的共性问题及疑问进行了热烈讨论、深入交流。这一参观交流活动,让参与者均受益匪浅。
  据彭博新闻社2日报道称,奥巴马执政过渡团队正考虑让国家航空航天局改造和利用技术相对成熟、成本更加低廉的军用火箭,来推进航空航天局的“星座计划”。根据“星座计划”,航空航天局准备在2020年前再次将宇航员送往月球,并进行火星及太阳系其他星球的探索计划。
圣天龙公司以营利为目的,未经史某同意便在涉案文章中使用了其照片,侵犯了史某的肖像权
  略……
天鸽互动正式在港交所挂牌上市,成为草根互联网登陆资本市场的又一典型样本。
因为一月份装修进入了传统淡季,装修公司节前的主要任务就是收集足够的定单,为春节后实现开门红做准备
据悉,本次活动是”爱永恒“系列活动的第一季,活动还将在情人节、七夕节以及中秋节陆续举办,浪漫的故事还将延续
  责任编辑:
  12月7日
没有物料,陈忠澄就到附近的拆迁工地,捡别人废弃的砖块和石子,之后又掏钱买来水泥,将破损的路面修葺一番。
  事故现场。
  传感器类型
  作为全球最负盛名的金融论坛,这次论坛,自然也成为了中国品牌对外展现实力的重要舞台。
  没想到你是这样的大JJ女孩!
 。ㄒ唬┓?媳碚缅嘌√跫?牡ノ恍杼畋ㄏ嘤Φ耐萍霰恚??郊?至3)。
  像乌镇夜宴中,这种暗流涌动又充满江湖气息的饭局,在汽车圈很少能见到,又或者,保守的汽车大佬们偶有规格极高的饭局,其保密工作至少做得会比互联网大佬们好太多。果然互联网圈,准确地说是科技圈的江湖,要更活色生香一些。
  以科学态度完善城镇住房制度(新知新觉)
  据《体育图片》透露,目前多特蒙德高层已经做出了解雇博斯的决定。俱乐部将于当地时间周日宣布这一决定。继任者是何人?你猜猜看。
  协议签订完毕,被征收人须上交土地证、房产证等权属证明原件。
  《王者荣耀》最强英雄Top10排行【TOP6】橘右京排位胜率50.9%,出场率41.7%,橘右京的打法已经完全开发出来,越来越多的玩家使用橘右京,但是橘右京不可购买是活动所得。橘右京最恶心的还是近战英雄却是远程输出,依靠技能还能回血位移,极度恶心,灵活也高。
“按每百名老人5张床位的标准计算,北京市的养老床位缺口应为万张。
  的50%。
  (一)在册股东优先认购安排君,已阅读到文档的结尾了呢~~
(;人类智力的另类较量--密码密码,帮助,密码密码,人类智力,较量无声,另类宠物,另类图片,蓝色较量
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
(;人类智力的另类较量--密码
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口发泄专题介绍:还在为工作不顺利而烦恼吗?还在为生活不顺心而忧伤吗?还在受学习疲惫的困扰吗?烦闷、苦恼、压力、郁闷,你应该让这些心情都OUT了!快来疯狂一下,来我们4399发泄专题吧,放松心情,消除压力,在这里寻回属于自己的HAPPY!
发泄手机游戏推荐
发泄小游戏排行
作品版权归作者所有,如果侵犯了您的版权,请,本站将在3个工作日内删除。温馨提示:抵制不良游戏,拒绝盗版游戏,注意自我保护,谨防受骗上当,适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活
| | |||||&关注:
||||&法律顾问:北京盛峰律师事务所
文明办网文明上网举报电话:&|&举报邮箱:&||
Copyright & 2004 - .com All Rights Reserved. 四三九九网络股份有限公司 版权所有【JAVA】转:RCP工程中字符调试运行正常,导出字符出错的解决方法(utf-8全局设置)
windows下一般系统编码为 GB2312(中文版的windows), 由于我比较喜欢utf8格式的编码,现将修改方式和大家分享如果要使 新建立工程、java文件直接使UTF-8则需要做以下工作:&1、windows-&Preferences...打开"首选项"对话框,左侧导航树,导航到general-&Workspace,右侧 Text file encoding,选择Other,改变为UTF-8,以后新建立工程其属性对话框中的Text file encoding即为UTF-8。&2、windows-&Preferences...打开"首选项"对话框,左侧导航树,导航到general-&Content Types,右侧Context Types树,点开Text,选择Java Source File,在下面的Default encoding输入框中输入UTF-8,点Update,则设置Java文件编码为UTF-8。其他java应用开发相关的文件 如:properties、XML等已经由Eclipse缺省指定,分别为ISO8859-1,UTF-8,如开发中确需改变编码格式则可以在此指定。&3、经过上述两步,新建java文件即为UTF-8编码,Eclipse编译、运行、调试都没问题,但是做RCP应用的Product输出时、或者插件输 出时,则总是出错,要么不能编译通过(输出时要重新compile)、要么输出的插件运行时中文显示乱码。此时需要再RCP应用、或插件Plugin工程 的build.properties中增加一行,javacDefaultEncoding.. = UTF-8。让输出时编译知道java源文件时UTF-8编码。这个设置需要保证所有的java源文件时UTF-8编码格式,如果不全是,可以参考 Eclipse帮中(Plug-in Development Environment Guide & Reference & Feature and Plug-in Build configuration),建议全部java源文件是UTF-8编码。&如果插件开发、RCP应用开发原来基于其他编码,如GB18030,想转换为UTF-8,则首先,做以上工作;然后通过查找编码转换工具,如基于 iconv的批量转换工具,将原编码转换为UTF-8编码,注意只转换java源文件,其他类型文件可能已经是比较合适的编码了;将原工程属性中的 Text file encoding,从原编码改为UTF-8即可。&
分享这篇日志的人也喜欢
月底任务好艰难
冲刺30万加油?
你好,旧时光~
报道我没丢
时间会说话
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@vip.sina.com··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场

我要回帖

更多关于 鲨鱼攻击人类 的文章

 

随机推荐