被编码问题搞炸了!

2016-04-18 15:57:50 +08:00
 vJianZhen

http://i3.piimg.com/d031ecea9295bc8c.png

做毕业设计,目前跟着《 Flask Web 开发》敲代码。 到了数据库这段,进行不下去了,因为编码问题。 文件的编码、连接编码、数据库编码、校验编码……不明所以,一团混乱。 图上的虽然是个警告,但是不消灭没法下一步。 网上找了一圈,还是没有方案能解决。 有大神知道怎么解决吗?还请不吝赐教~万分感谢!

8050 次点击
所在节点    Python
74 条回复
glasslion
2016-04-19 00:02:10 +08:00
@vJianZhen 分别在 Linux/Mac 和 Windows 下运行下面的代码, Linux 下这几个 encoding 全部是 utf8 而 windows 则是千奇百怪



```
import sys, locale

expressions = """
locale.getpreferredencoding()
type(my_file)
my_file.encoding
sys.stdout.isatty()
sys.stdout.encoding
sys.stdin.isatty()
sys.stdin.encoding
sys.stderr.isatty()
sys.stderr.encoding
sys.getdefaultencoding()
sys.getfilesystemencoding()
"""

my_file = open('dummy', 'w')

for expression in expressions.split():
value = eval(expression)
print(expression.rjust(30), '->', repr(value))

```

Python 和 encoding 1 相关的配置主要有下面几个:
1. ` locale.getpreferredencoding()` 这个用的是最广的。 这是 Python 在 open 文件时默认使用的 encoding
2. `sys.getdefaultencoding() ` 是 Python 进行 str/unicode(byte/str) 转换时默认使用的 encoding
3. `sys.getfilesystemencoding()` 是用来 encoding 文件**名**的, 例如 open(b'balabala')
4. 标准输入输出(print)的 encoding:
4.1 若设置了 `PYTHONIOENCODING` 环境变量, 则以次变量为准
4.2 标准输入输出是打到终端的话, 看终端的 locale 配置, 在 windows cmd 的代码页
4.3 标准输入输出被重定向到文件的话, 则参照 1 , 用的是 ` locale.getpreferredencoding()`

@hahastudio
@hahastudio
vJianZhen
2016-04-19 00:13:03 +08:00
@hahastudio 没有。这个警告可以通过更改系统区域设置来消除。另外,我把 username 拼写成 usrname 了,否则有警告也可以运行出来的。我很自责。
ibigbug
2016-04-19 02:48:05 +08:00
@pixstone 的 in text 这个是什么魔法
ipconfiger
2016-04-19 08:53:51 +08:00
自从弃了瘟到死就很少遇到编码问题了
picasso250
2016-04-19 10:00:17 +08:00
每次别人遇到编码问题,我都建议他换 PHP 。
但是没有一次别人认为我是真诚的。
jugelizi
2016-04-19 10:39:30 +08:00
哈哈
曾经在 win 下坑死
一段小代码 py2.7 运行没有任何报错就是没返回 扔到 linux 下很快结果出来了
zjj2008se
2016-04-19 11:16:36 +08:00
win 下面的编码一泡污,就算 py3 还是会 gbk 报错,除了改区域没别的办法。
pynix
2016-04-19 12:36:17 +08:00
主要问题就是在 Windows 下折腾。。
XiMing
2016-04-19 13:14:55 +08:00
收藏一波,感觉我也会遇到。
RockShake
2016-04-19 13:31:37 +08:00
看到问题解决了还是很开心的,很多人根本不看问题和用的版本,乱说一通,给 @florije 赞一个
zonghua
2016-04-20 01:33:22 +08:00
困扰了我许久,文件下载的时候怎么用中文命名?试过多钟方法均无效
TGlivecoding
2016-04-23 23:06:28 +08:00
如果是 3 的话我用 3 实现过一遍这本书代码: https://github.com/taogeT/flask_web_development_python3 ,不知道对你有没有帮助?
florije
2016-05-10 10:47:32 +08:00
@vJianZhen 其实问题在 mysql 上面,如果没猜错,你用的 mysql 是 5.7.*的,貌似里面验证什么地方编码的东西了。换上 5.6.*就没有这个提示了,当然上面系统编码修改那个算是临时的方案吧。
vJianZhen
2016-05-10 14:47:48 +08:00
@florije 确实是 5.7

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/271999

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX