首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
宝塔
V2EX  ›  Python

關於python 2.x中文字編碼的簡單說明

  •  
  •   013231 · 2012-05-08 15:01:03 +08:00 · 3654 次点击
    这是一个创建于 2749 天前的主题,其中的信息可能已经有所发展或是发生改变。
    剛剛看到有人在糾結文字編碼的問題, 我來說一下我的理解.
    我也是Python新手, 此文中如有錯誤請指正.

    1. 如果文件含有非ASCII字符, 在開頭加一行註釋:
    # encoding=utf-8
    # 如果你的源代碼文件不是UTF-8編碼, 把'utf-8'換成相應的編碼

    否則你會遭遇
    SyntaxError: Non-ASCII character
    錯誤.


    2. str類型是字節序列而非字符序列. 它的編碼方式由文件本身的編碼方式或encode時指定的編碼方式決定:
    1. 寫在源文件中的str, 編碼方式爲源文件的編碼方式.
    2. 從其它文件中讀取的str, 就是那個文件中的字節序列, 不做任何轉換.
    3. 使用encode方法得到的str, 其編碼爲指定編碼.
    對str使用len, 會返回字節序列的長度:
    UTF-8環境下, '文字'的字節序列爲0xe6 0x96 0x87 0xe5 0xad 0x97, len('文字') == 6.
    GB18030環境下, '文字'的字節序列爲0xce 0xc4 0xd7 0xd6, len('文字') == 4


    3. unicode類型是字符序列, 無需關心它內部的編碼方式(可能爲USC-2或USC-4).
    無論編碼爲何, len(u'文字') == 2.


    4. encode的作用是把字符序列編碼成字節序列(unicode -> str), decode的作用是把字節序列解碼成字符序列(str -> unicode). 如果對unicode使用encode或對str使用decode, 會得到錯誤或無意義的結果.

    5. __str__必須返回str類型, __unicode__必須返回unicode類型. 否則會收到TypeError.
    12 回复  |  直到 1970-01-01 08:00:00 +08:00
        1
    reus   2012-05-08 15:11:31 +08:00
    很清楚明白
        2
    arzon   2012-05-08 15:35:07 +08:00
    各种情况都解释地很清楚.
    还不太了解python文字编码机制的同学可以看看.
        3
    loading   2012-05-08 16:07:00 +08:00
    为了表示感谢,回复一个。5个铜币,亲收下^_^
        4
    Yo_oY   2012-05-12 14:35:49 +08:00
    回复一下以示感谢
        5
    luztak   2012-05-27 16:31:07 +08:00
    好文章
        6
    luztak   2012-05-27 16:31:16 +08:00
    好文章
        7
    luztak   2012-05-27 16:31:22 +08:00
    好文章,收藏了
        8
    luztak   2012-05-27 16:31:33 +08:00
    好文章,说得很清楚,收藏了
        9
    chaojie   2012-09-23 10:34:39 +08:00
    .py文件
    文件是utf-8编码(without BOM)

    文件头部写有
    #-*-coding:utf-8-*-
    #-*-encoding=utf-8

    文件中直接输入汉字

    文件编译通过
    运行时Exception输出
    'ascii' codec can't decode byte 0xef in position 8: ordinal not in range(128)

    这是什么原因?
        10
    013231   2012-09-23 12:34:08 +08:00
    @chaojie 請貼出具體的出錯代碼.
    我猜測你在decode一個包含非ASC II字符的str時未指定編碼, 或指定了ASC II編碼.
    '測試'.decode('ascii') #UnicodeDecodeError, '測試'兩字是非ASC II字符.
    '測試'.decode() #UnicodeDecodeError, 默認編碼是ASC II.
    '測試'.decode('utf-8') #正確指定了編碼, 返回u'測試'.
        11
    chaojie   2012-09-23 13:47:17 +08:00
    @013231 谢谢

    找到原因了,是我post过来的一个参数的问题
        12
    jiazhoulvke   2012-09-23 18:51:44 +08:00
    很收益,谢谢
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4174 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 02:14 · PVG 10:14 · LAX 18:14 · JFK 21:14
    ♥ Do have faith in what you're doing.