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
013231
V2EX  ›  Python

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

  •  
  •   013231 · 2012-05-08 15:01:03 +08:00 · 4480 次点击
    这是一个创建于 4370 天前的主题,其中的信息可能已经有所发展或是发生改变。
    剛剛看到有人在糾結文字編碼的問題, 我來說一下我的理解.
    我也是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
    reus
        1
    reus  
       2012-05-08 15:11:31 +08:00
    很清楚明白
    arzon
        2
    arzon  
       2012-05-08 15:35:07 +08:00
    各种情况都解释地很清楚.
    还不太了解python文字编码机制的同学可以看看.
    loading
        3
    loading  
       2012-05-08 16:07:00 +08:00
    为了表示感谢,回复一个。5个铜币,亲收下^_^
    Yo_oY
        4
    Yo_oY  
       2012-05-12 14:35:49 +08:00
    回复一下以示感谢
    luztak
        5
    luztak  
       2012-05-27 16:31:07 +08:00
    好文章
    luztak
        6
    luztak  
       2012-05-27 16:31:16 +08:00
    好文章
    luztak
        7
    luztak  
       2012-05-27 16:31:22 +08:00
    好文章,收藏了
    luztak
        8
    luztak  
       2012-05-27 16:31:33 +08:00
    好文章,说得很清楚,收藏了
    chaojie
        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)

    这是什么原因?
    013231
        10
    013231  
    OP
       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'測試'.
    chaojie
        11
    chaojie  
       2012-09-23 13:47:17 +08:00
    @013231 谢谢

    找到原因了,是我post过来的一个参数的问题
    jiazhoulvke
        12
    jiazhoulvke  
       2012-09-23 18:51:44 +08:00
    很收益,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5028 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 01:16 · PVG 09:16 · LAX 18:16 · JFK 21:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.