Python 编码折磨是一个必经过程吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
4gShell
V2EX    Python

Python 编码折磨是一个必经过程吗?

  •  
  •   4gShell 2014-09-13 09:02:33 +08:00 16961 次点击
    这是一个创建于 4113 天前的主题,其中的信息可能已经有所发展或是发生改变。
    跟django文档里的第一个学习项目在创建完初始的目录结构修改settings.py连接数据库的参数后,运行
    python manage.py syncdb出现下边的错误提示,下去买包烟希望能有惊喜答复。

    E:\django_Site\mysite>python manage.py syncdb
    Traceback (most recent call last):
    File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\core\managemen
    t\__init__.py", line 385, in execute_from_command_line
    utility.execute()
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\core\managemen
    t\__init__.py", line 354, in execute
    django.setup()
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\__init__.py",
    line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\apps\registry.
    py", line 108, in populate
    app_config.import_models(all_models)
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\apps\config.py
    ", line 197, in import_models
    self.models_module = import_module(models_module_name)
    File "G:\Python27\lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\contrib\auth\m
    odels.py", line 40, in <module>
    class Permission(models.Model):
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\db\models\base
    .py", line 125, in __new__
    new_class.add_to_class('_meta', Options(meta, **kwargs))
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\db\models\base
    .py", line 300, in add_to_class
    value.contribute_to_class(cls, name)
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\db\models\opti
    ons.py", line 166, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length(
    ))
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\db\__init__.py
    ", line 40, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\db\utils.py",
    line 242, in __getitem__
    backend = load_backend(db['ENGINE'])
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\db\utils.py",
    line 108, in load_backend
    return import_module('%s.base' % backend_name)
    File "G:\Python27\lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
    File "G:\Python27\lib\site-packages\django-1.7-py2.7.egg\django\db\backends\my
    sql\base.py", line 17, in <module>
    raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 20: invalid
    start byte

    E:\django_Site\mysite>
    第 1 条附言    2014-09-13 14:16:50 +08:00
    现在在Pycharm里,创建运行却一切正常,难道是IDE自带功能?
    54 条回复    2016-09-02 09:07:28 +08:00
    ericls
        1
    ericls  
       2014-09-13 09:11:26 +08:00   1
    换linux
    4gShell
        2
    4gShell  
    OP
       2014-09-13 09:13:16 +08:00
    @ericls 有过这样的想法,但是问题不解决就很纠结...
    leopardwei
        3
    leopardwei  
       2014-09-13 09:16:42 +08:00   1
    raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 20: invalid start byte

    显示 MySQL 配置报错,具体是 utf8 编码错误,贴出你的 setting。
    skyline75489
        4
    skyline75489  
       2014-09-13 09:20:14 +08:00
    我感觉这个更像是Windows的问题,Python的跨平台性已经很好了,但是Windows下还是偶尔会出些问题
    hslx111
        5
    hslx111  
       2014-09-13 09:22:07 +08:00
    编程还是不要用windows 最好,可以避免很多环节问题。
    当然python的编码确实很蛋疼
    no13bus
        6
    no13bus  
       2014-09-13 09:23:05 +08:00 via Android
    mysql的数据库编码为utf8 generial
    kongkongyzt
        7
    kongkongyzt  
       2014-09-13 09:24:15 +08:00   1
    即使是在Linux下也被Python的utf8编码折磨过很多次的人幽幽地说,是的
    ygmpkk
        8
    ygmpkk  
       2014-09-13 09:26:36 +08:00
    windows还有有件比较恶心的事情就,当注册表的目录键有中文的时候,python的http请求会报编码错误
    4gShell
        9
    4gShell  
    OP
       2014-09-13 09:29:42 +08:00
    @leopardwei
    这是MySQL status
    Server characterset: utf8
    Db characterset: utf8
    Client characterset: utf8
    Conn. characterset: utf8
    这是项目下的settings.py文件里截取的,会是下面LANGUAGE_CODE的设置的错误吗?
    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'HOST': '127.0.0.1',
    'PORT': '3306',
    'NAME': 'django_test',
    'USER': 'root',
    'PASSWORD': '123456'
    }
    }
    1.7/topics/i18n/

    LANGUAGE_CODE = 'en-us'

    TIME_ZOnE= 'Aisa/Shanghai'

    USE_I18N = True

    USE_L10N = True

    USE_TZ = True

    STATIC_URL = '/static/'
    leopardwei
        10
    leopardwei  
       2014-09-13 09:33:27 +08:00
    把所有编码统统设为 utf-8,比如操作系统、数据库、编辑器、浏览器,省心简单,:-)
    leopardwei
        11
    leopardwei  
       2014-09-13 09:37:22 +08:00
    LANGUAGE_CODE 在 syncdb 的时候还没用上呢,浏览器访问时,HTTP 协议头中的 Accept-Language 用。
    vicalloy
        12
    vicalloy  
       2014-09-13 09:46:09 +08:00   1
    很可能你只是忘了在文件头上设置
    # -*- coding: UTF-8 -*-
    onlyice
        13
    onlyice  
       2014-09-13 09:49:49 +08:00 via Android   1
    联系用 IDE 在抛异常处看看堆栈和产量值,应该很好定位问题
    leopardwei
        14
    leopardwei  
       2014-09-13 09:53:08 +08:00
    @vicalloy
    有可能,windows 默认编码是 GBK。python2.x 在文件头不显示指定的话,随系统设定了。

    没在 windows 下编写过代码,经验欠缺。
    onlyice
        15
    onlyice  
       2014-09-13 09:53:57 +08:00 via Android
    另外,MySQLdb 库装的路径对么,是不是给你装在一个中文目录里了,然后你手动把它的路径加到 sys.path 中?
    4gShell
        16
    4gShell  
    OP
       2014-09-13 10:02:15 +08:00
    插了三根烟,跪拜了,改了大家上面提到的点,但是就是not work,现在要砸电脑了
    arbipher
        17
    arbipher  
       2014-09-13 10:05:51 +08:00   1
    http://stackoverflow.com/questions/10838016/unicodedecodeerror-utf8-codec-cant-decode-byte

    "If you are using Notepad++ make sure the "encoding" (in the menu) of all your files is set to "UTF-8"."

    试试?
    zjgsamuel
        18
    zjgsamuel  
       2014-09-13 10:06:33 +08:00   1
    这才刚开始就准备放弃的节奏啦? 好好折腾吧~~
    运行平台 编码 甚至代码缩进 这些都得注意哦
    kafkakevin
        19
    kafkakevin  
       2014-09-13 10:13:23 +08:00   1
    Windows 上的问题不用解决。
    服务器端的程序,换 Linux。
    4gShell
        20
    4gShell  
    OP
       2014-09-13 10:15:44 +08:00
    @zjgsamuel 没有哦,只是找不到问题出在哪的那种心情很...
    4gShell
        21
    4gShell  
    OP
       2014-09-13 10:20:28 +08:00
    @kafkakevin 看来是要装个Linux,可是总觉得是在逃避问题...
    maikcn
        22
    maikcn  
       2014-09-13 10:24:06 +08:00   1
    感觉是缺少 # -*- coding: UTF-8 -*-
    以及文件编码不是utf-8 without BOM 导致的...
    kafkakevin
        23
    kafkakevin  
       2014-09-13 10:31:19 +08:00
    @4gShell 虚拟机跑起来。
    loading
        24
    loading  
       2014-09-13 10:31:53 +08:00 via iPad
    你还没遇到mine的那个呢
    z7039585
        25
    z7039585  
       2014-09-13 10:34:26 +08:00
    换个Linux试试
    imn1
        26
    imn1  
       2014-09-13 10:48:12 +08:00   1
    如果程序是utf-8编写的,在dos运行程序前,先运行
    chcp 65001
    这个命令是把当前dos环境设为codepage 65001,是windows中相当于utf-8的编码
    再测试,至于dos字体,建议去下载unicode字体(例如arial unicode)

    编码问题,无非是IO过程前后两个编码不一致,搞清楚就行
    NearTan
        27
    NearTan  
       2014-09-13 10:52:19 +08:00   1
    刚开始阵痛是必须的,熟悉这种节奏之后就带感了
    PS 推荐熟悉结构之后用IDE
    Kabie
        28
    Kabie  
       2014-09-13 11:06:31 +08:00   1
    试试Python3吧。。。
    Cu635
        29
    Cu635  
       2014-09-13 11:22:30 +08:00   1
    lz的python版本?python2还是python3?
    pandada8
        30
    pandada8  
       2014-09-13 11:28:49 +08:00 via Android   1
    Linux加Python3吧
    zonyitoo
        31
    zonyitoo  
       2014-09-13 11:53:23 +08:00   1
    Linux + Python 3就可以解决楼主的问题
    Reset
        32
    Reset  
       2014-09-13 11:56:44 +08:00 via iPhone   1
    所有文件加上
    #coding:utf8
    所有字符串特别是中文使用
    u"字符串"

    可以一定程度降低编码烦恼
    zzlettle
        33
    zzlettle  
       2014-09-13 12:00:35 +08:00   1
    我就是在我的Win7 系统里面开发的django,我是python3
    开发很顺利啊。编码问题的话,看你的编辑器了。我觉得python3处理一些什么这个码那个码的要好比python2
    amycs
        34
    amycs  
       2014-09-13 12:14:14 +08:00
    我也是卡在了编码上,叹气
    frankzeng
        35
    frankzeng  
       2014-09-13 12:51:17 +08:00
    python就是这编码一条不知卡死多少人,建议编码都采用utf8,从页面到数据库。
    muzuiget
        36
    muzuiget  
       2014-09-13 12:54:28 +08:00
    直接上 Linux,全世界 utf-8,省心。
    xiaowangge
        37
    xiaowangge  
       2014-09-13 13:19:29 +08:00 via Android
    推荐搜索下: Python Weekly Unicode之痛。这篇文章赞(^_^)
    daoluan
        38
    daoluan  
       2014-09-13 13:46:45 +08:00
    像 python这种高级语言易用性已经非常高了,按着错误提示寻找解决方法。这里应该是文件编码的问题,python 内部都是以 utf8 为标准的。
    lu18887
        39
    lu18887  
       2014-09-13 14:00:58 +08:00
    这个问题我遇到过,不过不是在SYNCDB的时候,是插数据的时候,mysql默认编码不是UTF-8,改成UTF-8的就可以了。具体Google
    4gShell
        40
    4gShell  
    OP
       2014-09-13 14:01:01 +08:00
    @Reset 根据错误提示文件来看,都是因为python自带module以及MySQL支持module的文件出错,难道要在这些文件头前全部加上# ...coding...
    4gShell
        41
    4gShell  
    OP
       2014-09-13 14:02:25 +08:00
    @lu18887 上面贴了MySQL status,编码都是utf8,难道是utf8与UTF-8的区别?
    imn1
        42
    imn1  
       2014-09-13 14:53:50 +08:00   1
    utf8_unicode_ci和utf8_general_ci区别

    在料系MySQL中有多种字符集,其中utf8_unicode_ci和utf8_general_ci是最常用的,但是utf8_general_ci对某些语言的支持有一些小问题,如果可以接受,那最好使用utf8_general_ci,因为它速度快。否则,请使用较为精确的utf8_unicode_ci,不过速度会慢一些。

    ----------------------------------------摘自wiki

    google也没有见到好的解决方案,但有两个帖子说重装了mysqldb模块解决,我没用过dj,不清楚是否这样
    4gShell
        43
    4gShell  
    OP
       2014-09-13 15:35:10 +08:00   1
    4gShell
        45
    4gShell  
    OP
       2014-09-13 22:17:19 +08:00
    @cbsw 恩,要换的,但也要弄个明白怎么回事。
    gladuo
        46
    gladuo  
       2014-09-14 00:22:17 +08:00
    @muzuiget windows想开发真难
    Reset
        47
    Reset  
       2014-09-14 07:59:52 +08:00 via iPhone
    @4gShell 猜测主要是你的 model 有些字段用了中文 比如 verbose_name 之类的
    把你自己写的 py 文件都加上编码utf8的声明,然后用 unicode 字符串

    如果能直接用 py3 最好 不折腾
    leopardwei
        48
    leopardwei  
       2014-09-14 09:29:51 +08:00
    @4gShell 楼主你太纠结了,强迫症严重了点儿,呵呵

    这明显是编码问题了,既然已经知道问题所在,也有解决办法,还耿耿于怀,何必呢!在 windows 下很受伤,换个地方吧,如 Linux 或者 Mac 之类的。
    azuginnen
        49
    azuginnen  
       2014-09-14 09:37:29 +08:00
    @xiaowangge 这篇文章真不错,再加上joel的那篇文章,字符编码这一块基本上就搞清了。。

    所有不懂编码问题的国际程序员,就跟不信基因的医生一样!!!(joel如是说)
    iam36
        50
    iam36  
       2014-09-14 09:50:20 +08:00 via Android
    把你粘过来的代码中的符号都手工重新录入一下,尤其是什么引号冒号之属。
    4gShell
        51
    4gShell  
    OP
       2014-09-14 12:14:01 +08:00
    @leopardwei 强迫症重度患者,好害羞。已换到ubuntu,不过眼睛看的好累。
    leopardwei
        52
    leopardwei  
       2014-09-14 23:50:17 +08:00 via iPad
    用 ubuntu 换大屏幕显示器,终端字体及背景设好,哦,对了,字体大一点,一样很 OK 的说。
    jun4rui
        53
    jun4rui  
       2014-09-15 10:31:40 +08:00
    Ruby也一样的,在Windows下(简体Windows默认字符集是GBK,还不能改)各种报错……
    lzjun
        54
    lzjun  
       2016-09-02 09:07:28 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5637 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 172ms UTC 02:29 PVG 10:29 LAX 18:29 JFK 21:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86