被 python 的编码问题折腾死了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
Yourdaye

被 python 的编码问题折腾死了

  •  
  •   Yourdaye Jan 18, 2016 7383 views
    This topic created in 3752 days ago, the information mentioned may be changed or developed.

    python2.7+ubuntu

    用 beautifusoup 来解析一个网页,死活都输出不了中文

    什么 encode,decode 试了个遍都不行啊

    折腾了一下午.....

    有过类似经验的 V 友们给点指导啊!

    Supplement 1    Jan 19, 2016
    采用了 @fy 的方法,问题已解决,感谢各位的方案
    Supplement 2    Jan 20, 2016
    2016.1.20 更新:
    改用 requests 之后依然会在某些情况下出现乱码,最后用下面的方法彻底解决了,多谢博主!

    http://sh3ll.me/2014/06/18/python-requests-encoding/
    50 replies    2016-01-20 17:26:19 +08:00
    bakabie
        1
    bakabie  
       Jan 18, 2016 via Android
    检查下 ide 的编码设置是否正确。。。
    我之前也是这样,在 pycharm 上无法输出中文。。。结果发现是 pycharm 内置编码没设置正确
    flyer103
        2
    flyer103  
       Jan 18, 2016
    黑魔法:

    ```python
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    ```
    yunying
        3
    yunying  
       Jan 18, 2016
    不谢:
    http://wklken.me/posts/2013/08/31/python-extra-coding-intro.html

    看完后并理解后你就会感谢我的了
    Yourdaye
        4
    Yourdaye  
    OP
       Jan 18, 2016
    @bakabie 我是现在 pycharm 上测试,然后再服务器上测试,都不行
    DuckJK
        5
    DuckJK  
       Jan 18, 2016
    windfarer
        6
    windfarer  
       Jan 18, 2016 via Android
    先看网页的编码是什么,再在代码里做相应 decode
    just1
        7
    just1  
       Jan 18, 2016 via Android   1
    encode('utf-8').decode('unicode-escape')
    送你神器
    zaishanfeng
        8
    zaishanfeng  
       Jan 18, 2016 via Android
    楼上的几个方法我都用过 还是有问题 目前遇到的最好的解决方法是 django 的 smart_str
    RqPS6rhmP3Nyn3Tm
        9
    RqPS6rhmP3Nyn3Tm  
       Jan 18, 2016
    为什么不用 Python 3 呢,原生支持 utf-8
    抓网页直接 decode('utf-8') 就好了
    leavic
        10
    leavic  
       Jan 18, 2016
    @Yourdaye pycharm 默认的 console encoding 是 UTF-8 ,而其他系统的的 console 不一定是这个,所以 console 输出的问题不是单纯靠编码能解决的。
    Yourdaye
        11
    Yourdaye  
    OP
       Jan 18, 2016
    @BXIA 2 和 3 的这个坑难道填不平了?
    Yourdaye
        12
    Yourdaye  
    OP
       Jan 18, 2016
    @zaishanfeng 可惜我用的是 flask
    lcj2class
        13
    lcj2class  
       Jan 18, 2016   1
    RqPS6rhmP3Nyn3Tm
        14
    RqPS6rhmP3Nyn3Tm  
       Jan 18, 2016
    @Yourdaye 没用过 2 ,不过现在都在慢慢迁移到 3 了,以后可能也不会填坑了吧
    crayhuang
        15
    crayhuang  
       Jan 18, 2016
    同样被折腾过,用了跟二楼一样的方法解决
    fy
        16
    fy  
       Jan 18, 2016   2
    1. 楼主你别用 urllib ,换 requests , resp.text 直接是 unicode , py2 py3 直接 print 都能看
    2. 上 Python3 , py2 我们别管了
    Victor215
        17
    Victor215  
       Jan 18, 2016
    用 requests + chardet, 爬虫包治百病!
    knightdf
        18
    knightdf  
       Jan 18, 2016
    全部用 unicode
    yaozeyuan93
        19
    yaozeyuan93  
       Jan 18, 2016
    先不用管 encode/decode 的事。

    在程序开始时将编码设成 utf-8

    ```
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    ```

    代码里凡是涉及到字符串的,一律使用 u''字符串。

    对于外部输入,一律使用 decode 处理成 unicode 字符,确保程序内部是一个纯净的 unicode 字符环境

    输出时,视情况 encode 成 utf-8 的 bytes 或者直接输出(让 python 系统自行处理)。

    只要做到这些,一般就不会再碰见乱码问题了。

    创意来源: Pycon2012 演讲, Unicode 之痛。中文翻译: https://github.com/PyCodersCN/PyCodersCN/blob/6d0c0607dfa609c443eaea5904789cf833ebc679/issue5/unipain.rst

    我在自己的知乎助手( py2.7+urllib2+BS4 )里试了一下,很好用。目前为止还没有人向我反馈过乱码 bug
    weakiwi
        20
    weakiwi  
       Jan 18, 2016
    有时候是 ide 自己的问题,建议直接 linux 环境 nano
    ltm
        21
    ltm  
       Jan 18, 2016
    你需要 python3
    n6DD1A640
        22
    n6DD1A640  
       Jan 18, 2016
    反正能用 python 3 的地方我都用了。。
    jok3r
        23
    jok3r  
       Jan 18, 2016
    暑假折腾过一次,用 Python3 解决,后来再转 Python2 ,却又没问题了。
    前几天又折腾一次,折腾一晚上,结果发现网页开启了 gzip 压缩,需要先解压再解析。
    zaishanfeng
        24
    zaishanfeng  
       Jan 18, 2016 via Android
    @Yourdaye 这个只是一个函数 可以 import 直接导入就能用 试过很多方法 什么 reload 什么 requests 什么 encode 有的情况上面的可以解决 但是很多时候试遍了还是不行 只有 smart_str 百试百灵
    quietin
        25
    quietin  
       Jan 18, 2016
    nooper
        26
    nooper  
       Jan 19, 2016 via iPad
    py3
    Delbert
        27
    Delbert  
       Jan 19, 2016 via Android
    用 requests 输出文件编码。我曾接解析过一个繁体中文网页差点没折腾死我,后来发现是 ISO1xxxx 编码……
    fy
        28
    fy  
       Jan 19, 2016
    @Delbert requests 特定网页有一个问题,没记错的话是信任服务器反馈的 encoding 而不是 html 中指定的 encoding 。

    不过这个函数官方也写了,我不懂他们为啥不默认开启
    LINAICAI
        29
    LINAICAI  
       Jan 19, 2016
    还从来没遇到过编码问题没法解决的。。。别乱喷
    limbo0
        30
    limbo0  
       Jan 19, 2016
    方法是一律导成 unicode
    popil1987
        31
    popil1987  
       Jan 19, 2016
    由于你没有放出错误,所以说几处容易乱码的你参考一下。
    1.确定获取的内容是字符串吗?有可能是 gzip 压缩的
    2.用 chardet 检测获取内容的编码,或者存到文件中,用 file 命令查看文件编码
    3.获取的内容要 decode 成 unicode 才能输出
    4.存到文件要 encode 成某个编码
    laobaozi
        32
    laobaozi  
       Jan 19, 2016 via iPhone
    chardet +1
    另外我还遇见过抓取的网页有一部分在终端显示不全,还以为网页是由 js 生成的,直到我把抓取的内容写入文件....
    ltype
        34
    ltype  
       Jan 19, 2016
    用 python3 啊
    zhuangzhuang1988
        35
    zhuangzhuang1988  
       Jan 19, 2016
    所以, 来学 c#吧..
    strahe
        36
    strahe  
       Jan 19, 2016
    python3 从来不考虑这些问题
    Yourdaye
        37
    Yourdaye  
    OP
       Jan 19, 2016
    @strahe 以后果断 python3,不知道 2 的坑还有多少
    caomaocao
        38
    caomaocao  
       Jan 19, 2016
    @Victor215 chardet 对短的文本 不一定判断对啊!
    zkzipoo
        39
    zkzipoo  
       Jan 19, 2016
    locale charmap
    #coding:utf-8
    怎么不把网页发过来
    zkzipoo
        40
    zkzipoo  
       Jan 19, 2016
    更正一下#coding=utf-8
    picasso250
        41
    picasso250  
       Jan 19, 2016
    请使用 PHP
    fhefh
        42
    fhefh  
       Jan 19, 2016
    学习了~~
    esile
        43
    esile  
       Jan 19, 2016 via iPhone
    @flyer103 必须这样玩
    XuanYuan
        44
    XuanYuan  
       Jan 19, 2016
    我也是,被 ruby 的编码问题折腾得够呛。

    问题是这样子的:
    我现在有一个 utf-8 编码的文本,但是需要把它转换成 ASCII 格式,比如说,原来的“生”字要转换成“\u751F ”。

    查了很多资料,还是一头雾水。
    MemoryCorner
        45
    MemoryCorner  
       Jan 19, 2016
    用 Python3, 用 Python3, 用 Python3, 早晚要用的。
    cxh116
        46
    cxh116  
       Jan 19, 2016   1
    @XuanYuan 这种在 python 里面叫 "unicode escape"

    ruby 可以参考这个 http://stackoverflow.com/questions/5560914/how-do-i-escape-a-unicode-string-with-ruby

    puts '你好'.unpack('U*').map{ |i| "\\u" + i.to_s(16).rjust(4, '0') }.join
    XuanYuan
        47
    XuanYuan  
       Jan 20, 2016
    @cxh116 已谢!
    我是初学,之前还想用 iconv 来解决未果。
    XuanYuan
        48
    XuanYuan  
       Jan 20, 2016
    @cxh116 如果只需要转一个句子里面的中文,这个正则应该加在什么地方呢?

    比如说,“我是 1 级 VIP ”中只转“我、是、级”。
    cxh116
        49
    cxh116  
       Jan 20, 2016   1
    @XuanYuan 用 gsub,自己把下面的正则替换成你自己想要的正则.

    puts '你好 123abc'.gsub(/[\W]/){|s| s.unpack('U*').map{|i| "\\u" + i.to_s(16).rjust(4, '0')}.join }

    正则可以参考这个
    http://apidock.com/rails/v3.0.5/ActiveSupport/JSON/Encoding/escape/class
    XuanYuan
        50
    XuanYuan  
       Jan 20, 2016
    收到,谢谢!
    我再好好学习一下。
    About     Help     Advertise     Blog     API     FAQ     Solana     3139 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 142ms UTC 14:43 PVG 22:43 LAX 07:43 JFK 10:43
    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