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 · 16184 次点击
    这是一个创建于 3513 天前的主题,其中的信息可能已经有所发展或是发生改变。
    跟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
    @imn1 很感谢呢。
    cbsw
        44
    cbsw  
       2014-09-13 18:25:34 +08:00
    先考虑一下项目能不能用 python3,能的话就赶紧切到 py3 上,自己学习的话就更应该用 python3 了,python 党要积极地拥抱 python3,现在连 django,flask,numpy,scipy,scikit-learn,sphinx等这些大型项目都已经支持 python3 了,python3 在很多方面都是比较方便的,基本也不会遇到编码问题了
    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   ·   我们的愿景   ·   实用小工具   ·   5514 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 01:39 · PVG 09:39 · LAX 18:39 · JFK 21:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.