python编码灵异问题.

I_NBFA 2010-07-25 01:05:57
xp下, cmd默认gbk, 编辑器gvim7.2, python版本2.7

以gbk保存源文件, gbk解码则下面的程序没问题.

# coding=gbk

a = "中国";
print(repr(a));
print(a);


但以gbk保存源文件, utf8解码, 猜猜输出什么?

# coding=utf-8

a = "中国";
print(repr(a));
print(a);

按说以gbk编码, 以utf8解码应该出错!
但是程序正常输出, 并且print(repr(a))显示a为gbk编码...

我吧utf-8换成utf8, 更灵异的发生了

# coding=utf8

a = "你好";
print repr(a);
print a


程序正常报错....无法解码....

难道utf8正确, utf-8不正确吗? 可是没有指定解码方式python是杂解码的?
显然utf-8起作用了, 只不过解成了gbk.......
而且如果是utf8文件, 只能写"utf-8"写"utf8"出错.....
百思不得其解.....
...全文
513 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
feilniu 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 i_nbfa 的回复:]

引用 16 楼 thy38 的回复:
编码始终是程序员的心病啊。还是那些只用Unicode的好些

py3k, 统一都是unicode字符串.
[/Quote]

所以py3是很有前瞻性的设计。
codesnail 2010-09-07
  • 打赏
  • 举报
回复
纠结。。。。。。。。。。
I_NBFA 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 thy38 的回复:]
编码始终是程序员的心病啊。还是那些只用Unicode的好些
[/Quote]
py3k, 统一都是unicode字符串.
thy38 2010-09-02
  • 打赏
  • 举报
回复
编码始终是程序员的心病啊。还是那些只用Unicode的好些
lixq2000 2010-08-05
  • 打赏
  • 举报
回复
这个问题好复杂啊
iambic 2010-07-28
  • 打赏
  • 举报
回复
试了下,确实如楼主所说。
I_NBFA 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oluckly 的回复:]
请楼主注意编码规范问题,最好在代码中统一为unicode类型编码:
b = u"中国"

编码转换用encode以及uncode操作。 在python空间支持“mdcs”编码格式(支持中英文)
[/Quote]
好象没这个"编码规范"一说吧,
本地码直接拿来用,
python的unicode需要多1次转换步骤.
对于某些大量文本处理或者web编程, 频繁的转换编码不仅损伤效率还是多余的.
好了先不说这个问题, 帮忙看看那灵异问题吧....
CcVictory 2010-07-27
  • 打赏
  • 举报
回复
怎么3段代码我都可以执行出来呢..
oluckly 2010-07-26
  • 打赏
  • 举报
回复
请楼主注意编码规范问题,最好在代码中统一为unicode类型编码:
b = u"中国"

编码转换用encode以及uncode操作。 在python空间支持“mdcs”编码格式(支持中英文)
I_NBFA 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 feilniu 的回复:]
LZ确定三个脚本都是以gbk保存的文件吗?

我这边测试,第2种情况和第3种情况都是报错。虽然我用的是3.1。
[/Quote]
当然确定, 3.1没测试过.
feilniu 2010-07-25
  • 打赏
  • 举报
回复
LZ确定三个脚本都是以gbk保存的文件吗?

我这边测试,第2种情况和第3种情况都是报错。虽然我用的是3.1。
I_NBFA 2010-07-25
  • 打赏
  • 举报
回复
大家都来帮忙看看这个问题吧, 很郁闷...几乎在线等../.
I_NBFA 2010-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 angel_su 的回复:]
1,2的问题应该是a是普通字串,过程也未牵涉编解码所以在windows的shell下结果一致,然若a=u'中国',2会有错吧

试了3的utf8是比较奇怪,貌似主动检查字串a的内容了。一般我都用coding:utf-8...
[/Quote]
123都需要解码的, 虽然cmd认识但python并不认识, 这时需要根据你的指示解码.
其实内置unicode也需要解码, 只不会而后又转成了内置unicode.
不信你把开头的#coding..去掉试试.
angel_su 2010-07-25
  • 打赏
  • 举报
回复
1,2的问题应该是a是普通字串,过程也未牵涉编解码所以在windows的shell下结果一致,然若a=u'中国',2会有错吧

试了3的utf8是比较奇怪,貌似主动检查字串a的内容了。一般我都用coding:utf-8...
I_NBFA 2010-07-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 iambic 的回复:]
gbk没有bom,但是utf-8有。
解码错误也很多情况。比如可能是在读bom的时候抛错,可能是在print的时候抛错。实际上每个希望解决问题的人都都应该仔细检查和分析异常信息,并把这个信息贴出来,而不是简单看了下“哦,是编码错误”,然后就茫然无措了。
很多时候解决问题的关键不是在你不知道的地方,而是在你没注意的地方。
[/Quote]
这方面我特别注意了, utf8是有bom, 不过我是gbk.
错误信息是:
syntaxerror: 'utf8' codec cant decode byte 0xc4 in position 0: invalid continuation byte
iambic 2010-07-25
  • 打赏
  • 举报
回复
gbk没有bom,但是utf-8有。
解码错误也很多情况。比如可能是在读bom的时候抛错,可能是在print的时候抛错。实际上每个希望解决问题的人都都应该仔细检查和分析异常信息,并把这个信息贴出来,而不是简单看了下“哦,是编码错误”,然后就茫然无措了。
很多时候解决问题的关键不是在你不知道的地方,而是在你没注意的地方。
I_NBFA 2010-07-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iambic 的回复:]
报的什么错?分别贴上来看看。
另外要特别注意下你的文本有没有bom。
[/Quote]
gbk有bom么? 就是解码错误.
iambic 2010-07-25
  • 打赏
  • 举报
回复
报的什么错?分别贴上来看看。
另外要特别注意下你的文本有没有bom。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧