推荐学习书目
› 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 · Sep 13, 2014 · 17863 views
    This topic created in 4434 days ago, the information mentioned may be changed or developed.
    跟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>
    Supplement 1  ·  Sep 13, 2014
    现在在Pycharm里,创建运行却一切正常,难道是IDE自带功能?
    54 replies  •  2016-09-02 09:07:28 +08:00
    ericls
    ericls
    Sep 13, 2014❤️1
    1
    换linux
    4gShell
    4gShell
    OP
    Sep 13, 2014
    2
    @ericls 有过这样的想法,但是问题不解决就很纠结...
    leopardwei
    leopardwei
    Sep 13, 2014❤️1
    3
    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
    skyline75489
    Sep 13, 2014
    4
    我感觉这个更像是Windows的问题,Python的跨平台性已经很好了,但是Windows下还是偶尔会出些问题
    hslx111
    hslx111
    Sep 13, 2014
    5
    编程还是不要用windows 最好,可以避免很多环节问题。
    当然python的编码确实很蛋疼
    no13bus
    no13bus
    Sep 13, 2014 via Android
    6
    mysql的数据库编码为utf8 generial
    kongkongyzt
    kongkongyzt
    Sep 13, 2014❤️1
    7
    即使是在Linux下也被Python的utf8编码折磨过很多次的人幽幽地说,是的
    ygmpkk
    ygmpkk
    Sep 13, 2014
    8
    windows还有有件比较恶心的事情就,当注册表的目录键有中文的时候,python的http请求会报编码错误
    4gShell
    4gShell
    OP
    Sep 13, 2014
    9
    @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
    leopardwei
    Sep 13, 2014
    10
    把所有编码统统设为 utf-8,比如操作系统、数据库、编辑器、浏览器,省心简单,:-)
    leopardwei
    leopardwei
    Sep 13, 2014
    11
    LANGUAGE_CODE 在 syncdb 的时候还没用上呢,浏览器访问时,HTTP 协议头中的 Accept-Language 用。
    vicalloy
    vicalloy
    Sep 13, 2014❤️1
    12
    很可能你只是忘了在文件头上设置
    # -*- coding: UTF-8 -*-
    onlyice
    onlyice
    Sep 13, 2014 via Android❤️1
    13
    联系用 IDE 在抛异常处看看堆栈和产量值,应该很好定位问题
    leopardwei
    leopardwei
    Sep 13, 2014
    14
    @vicalloy
    有可能,windows 默认编码是 GBK。python2.x 在文件头不显示指定的话,随系统设定了。

    没在 windows 下编写过代码,经验欠缺。
    onlyice
    onlyice
    Sep 13, 2014 via Android
    15
    另外,MySQLdb 库装的路径对么,是不是给你装在一个中文目录里了,然后你手动把它的路径加到 sys.path 中?
    4gShell
    4gShell
    OP
    Sep 13, 2014
    16
    插了三根烟,跪拜了,改了大家上面提到的点,但是就是not work,现在要砸电脑了
    arbipher
    arbipher
    Sep 13, 2014❤️1
    17
    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
    zjgsamuel
    Sep 13, 2014❤️1
    18
    这才刚开始就准备放弃的节奏啦? 好好折腾吧~~
    运行平台 编码 甚至代码缩进 这些都得注意哦
    kafkakevin
    kafkakevin
    Sep 13, 2014❤️1
    19
    Windows 上的问题不用解决。
    服务器端的程序,换 Linux。
    4gShell
    4gShell
    OP
    Sep 13, 2014
    20
    @zjgsamuel 没有哦,只是找不到问题出在哪的那种心情很...
    4gShell
    4gShell
    OP
    Sep 13, 2014
    21
    @kafkakevin 看来是要装个Linux,可是总觉得是在逃避问题...
    maikcn
    maikcn
    Sep 13, 2014❤️1
    22
    感觉是缺少 # -*- coding: UTF-8 -*-
    以及文件编码不是utf-8 without BOM 导致的...
    kafkakevin
    kafkakevin
    Sep 13, 2014
    23
    @4gShell 虚拟机跑起来。
    loading
    loading
    Sep 13, 2014 via iPad
    24
    你还没遇到mine的那个呢
    z7039585
    z7039585
    Sep 13, 2014
    25
    换个Linux试试
    imn1
    imn1
    Sep 13, 2014❤️1
    26
    如果程序是utf-8编写的,在dos运行程序前,先运行
    chcp 65001
    这个命令是把当前dos环境设为codepage 65001,是windows中相当于utf-8的编码
    再测试,至于dos字体,建议去下载unicode字体(例如arial unicode)

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

    可以一定程度降低编码烦恼
    zzlettle
    zzlettle
    Sep 13, 2014❤️1
    33
    我就是在我的Win7 系统里面开发的django,我是python3
    开发很顺利啊。编码问题的话,看你的编辑器了。我觉得python3处理一些什么这个码那个码的要好比python2
    amycs
    amycs
    Sep 13, 2014
    34
    我也是卡在了编码上,叹气
    frankzeng
    frankzeng
    Sep 13, 2014
    35
    python就是这编码一条不知卡死多少人,建议编码都采用utf8,从页面到数据库。
    muzuiget
    muzuiget
    Sep 13, 2014
    36
    直接上 Linux,全世界 utf-8,省心。
    xiaowangge
    xiaowangge
    Sep 13, 2014 via Android
    37
    推荐搜索下: Python Weekly Unicode之痛。这篇文章赞(^_^)
    daoluan
    daoluan
    Sep 13, 2014
    38
    像 python这种高级语言易用性已经非常高了,按着错误提示寻找解决方法。这里应该是文件编码的问题,python 内部都是以 utf8 为标准的。
    lu18887
    lu18887
    Sep 13, 2014
    39
    这个问题我遇到过,不过不是在SYNCDB的时候,是插数据的时候,mysql默认编码不是UTF-8,改成UTF-8的就可以了。具体Google
    4gShell
    4gShell
    OP
    Sep 13, 2014
    40
    @Reset 根据错误提示文件来看,都是因为python自带module以及MySQL支持module的文件出错,难道要在这些文件头前全部加上# ...coding...
    4gShell
    4gShell
    OP
    Sep 13, 2014
    41
    @lu18887 上面贴了MySQL status,编码都是utf8,难道是utf8与UTF-8的区别?
    imn1
    imn1
    Sep 13, 2014❤️1
    42
    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
    4gShell
    OP
    Sep 13, 2014❤️1
    43
    @imn1 很感谢呢。
    cbsw
    cbsw
    Sep 13, 2014
    44
    先考虑一下项目能不能用 python3,能的话就赶紧切到 py3 上,自己学习的话就更应该用 python3 了,python 党要积极地拥抱 python3,现在连 django,flask,numpy,scipy,scikit-learn,sphinx等这些大型项目都已经支持 python3 了,python3 在很多方面都是比较方便的,基本也不会遇到编码问题了
    4gShell
    4gShell
    OP
    Sep 13, 2014
    45
    @cbsw 恩,要换的,但也要弄个明白怎么回事。
    gladuo
    gladuo
    Sep 14, 2014
    46
    @muzuiget windows想开发真难
    Reset
    Reset
    Sep 14, 2014 via iPhone
    47
    @4gShell 猜测主要是你的 model 有些字段用了中文 比如 verbose_name 之类的
    把你自己写的 py 文件都加上编码utf8的声明,然后用 unicode 字符串

    如果能直接用 py3 最好 不折腾
    leopardwei
    leopardwei
    Sep 14, 2014
    48
    @4gShell 楼主你太纠结了,强迫症严重了点儿,呵呵

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

    所有不懂编码问题的国际程序员,就跟不信基因的医生一样!!!(joel如是说)
    iam36
    iam36
    Sep 14, 2014 via Android
    50
    把你粘过来的代码中的符号都手工重新录入一下,尤其是什么引号冒号之属。
    4gShell
    4gShell
    OP
    Sep 14, 2014
    51
    @leopardwei 强迫症重度患者,好害羞。已换到ubuntu,不过眼睛看的好累。
    leopardwei
    leopardwei
    Sep 14, 2014 via iPad
    52
    用 ubuntu 换大屏幕显示器,终端字体及背景设好,哦,对了,字体大一点,一样很 OK 的说。
    jun4rui
    jun4rui
    Sep 15, 2014
    53
    Ruby也一样的,在Windows下(简体Windows默认字符集是GBK,还不能改)各种报错……
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1576 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 97ms · UTC 23:30 · PVG 07:30 · LAX 15:30 · JFK 18:30
    ♥ Do have faith in what you're doing.