免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7115 | 回复: 23
打印 上一主题 下一主题

source code encoding问题,我找了半天都没找到原因:( [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-06 04:23 |只看该作者 |倒序浏览
我在pythinwin里编辑了一个utf_8.py。内容如下:
# -*- coding : utf-8 -*-
x = '哈'
print repr(x)
print x
保存后运行,输出结果为'\xb9\xfe' 哈。
我觉得奇怪的是:这个文件编辑和保存的编码是GBK,输出的'\xb9\xfe'也是'哈'的GBK编码,那么为什么用utf-8能通过编译呢?如果把utf-8去掉,则提示non-ascii的错,那么说明在编译时是使用utf-8了的。但是使用了的话,repr(x)应该输出'哈'的utf-8码'\xe5\x93\x88'啊。

如果把源文件改为:
x = '\xb9\xfe'
print repr(x)
print x
结果和上面一样,说明在编译时使用utf-8,将'哈'转成了'\xb9\xfe'。也就是说把GBK的'哈',用utf-8再转成了'哈'的GBK码,我觉得很奇怪,有谁知道这个问题的答案吗?或者说我这个例子本身存在问题?

论坛徽章:
0
2 [报告]
发表于 2009-03-06 08:19 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2009-03-06 09:56 |只看该作者
我在Ulipad的中的运行情况
1.
#coding=utf-8
x = '哈'
print repr(x)
print x

> "C:\Python25\pythonw.exe" -u "C:\Users\asus\Desktop\Untitled 1.py"
'\xe5\x93\x88'
\xe5\x93\x88

2.
#coding=gbk
x = '哈'
print repr(x)
print x

> "C:\Python25\pythonw.exe" -u "C:\Users\asus\Desktop\Untitled 1.py"
'\xb9\xfe'


3.
# -*- coding : gbk -*-
x = '哈'
print repr(x)
print x

> "C:\Python25\pythonw.exe" -u "C:\Users\asus\Desktop\Untitled 1.py"
  File "C:\Users\asus\Desktop\Untitled 1.py", line 2
SyntaxError: Non-ASCII character '\xb9' in file C:\Users\asus\Desktop\Untitled 1.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details


4.
# -*- coding : utf-8 -*-
x = '哈'
print repr(x)
print x

> "C:\Python25\pythonw.exe" -u "C:\Users\asus\Desktop\Untitled 1.py"
  File "C:\Users\asus\Desktop\Untitled 1.py", line 2
SyntaxError: Non-ASCII character '\xb9' in file C:\Users\asus\Desktop\Untitled 1.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

论坛徽章:
0
4 [报告]
发表于 2009-03-06 09:58 |只看该作者
Ulipad中不识别
# -*- coding : gbk/utf-8 -*-

论坛徽章:
0
5 [报告]
发表于 2009-03-06 11:27 |只看该作者

回复 #4 xiaomayi0323 的帖子

pythonwin中是识别#-*-cdoing:utf-8 -*-的。
难到是windoes下python的解析过程和linux下不同?

论坛徽章:
0
6 [报告]
发表于 2009-03-06 11:29 |只看该作者

回复 #2 luffy.deng 的帖子

我看了这分说明的,它说明了分析和编译的过程:
1. read the file

       2. decode it into Unicode assuming a fixed per-file encoding

       3. convert it into a UTF-8 byte string

       4. tokenize the UTF-8 content

       5. compile it, creating Unicode objects from the given Unicode data
          and creating string objects from the Unicode literal data
          by first reencoding the UTF-8 data into 8-bit string data
          using the given file encoding
但是就是因为按它这么解释,无法说通我上面遇到的这个问题,所以才觉得很奇怪。

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
7 [报告]
发表于 2009-03-06 12:31 |只看该作者
这个跟运行环境的代码页设置和IDE都有关系的,我在windows xp 936下不同的IDE内输出都不同,其实连输入的处理都不同呢,有时候要用一下encode,有时候又不能用encode.....

python最麻烦的就是这个问题了,简直能把人郁闷死...

论坛徽章:
0
8 [报告]
发表于 2009-03-06 12:49 |只看该作者
原帖由 Levin_1221 于 2009-3-6 11:27 发表
pythonwin中是识别#-*-cdoing:utf-8 -*-的。
难到是windoes下python的解析过程和linux下不同?

我的环境是 windows XP  在pythonwin中尝试的结果是和你相同的
所以解析应该是相同的

论坛徽章:
0
9 [报告]
发表于 2009-03-06 15:28 |只看该作者
唉……
说了多少次了# -*- coding: utf-8 -*-是给Emacs看的,编辑器存成什么编码,python就怎么读这个文件,不是靠读了这个注释再去判断文件的编码的

论坛徽章:
0
10 [报告]
发表于 2009-03-06 15:28 |只看该作者
编辑器和IDE保存文件时候都要看下。有可能默认就存为utf8了
1.如果coding为gbk或cp936之类,文件另存编码是ANSI
2.如果指定为utf8,文件就得存为utf8格式。

最好坚持统一编码,省的烦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP