Python3 编码问题 - V2EX
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
domino
V2EX    Python

Python3 编码问题

  •  
  •   domino 2016-11-15 01:12:31 +08:00 5197 次点击
    这是一个创建于 3254 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的系统为繁体中文 Win7 64bit / Python35 (32bit)
    不知道为何下列程序,遇到简体,执行后会有错误.
    请问该怎解决呢?

    程序码

    from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://home.baidu.com/") soup = BeautifulSoup(html , "lxml") print(soup.title); 

    错误如下

    C:\py>hellokitty.py Traceback (most recent call last): File "C:\py\hellokitty.py", line 5, in <module> print(soup.title); UnicodeEncodeError: 'cp950' codec can't encode character '\u5173' in position 7: illegal multibyte sequence 
    26 条回复    2016-11-16 17:18:26 +08:00
    jy02201949
        1
    jy02201949  
       2016-11-15 01:26:34 +08:00   1
    这种一般都是 windows 的锅, cmd 太蛋疼了,自己建个虚拟机跑吧
    hard2reg
        2
    hard2reg  
       2016-11-15 01:32:18 +08:00   1
    建议用 IDLE ,别用蛋疼的 cmd 。
    hard2reg
        3
    hard2reg  
       2016-11-15 01:33:32 +08:00
    或者先在 CMD 执行这个 chcp 65001
    Arthur2e5
        4
    Arthur2e5  
       2016-11-15 02:40:41 +08:00   2
    Windows 控制台默认使用目前系统编码,对于繁体中文是 Big5/cp950 。 Python 在 print 一个字符串之前,需要编码到目前 cmd 窗口使用的编码,而你遇到了个( Python 印象中的) Big5 没有的字符。(之所以强调可能是 Python 的错觉,是因为这个语言的官方实现对于编解码的实现经常拘泥“标准”到脱离现实的地步: cp936 直接指到 gbk 结果没有该有的欧元符号、 cp950 没有 HKSCS 支持……)

    你可以使用 chcp 65001 切到 utf-8 控制台窗口,当然也可以像楼上建议的一样走路绕开 Windows 控制台。
    TaMud
        5
    TaMud  
       2016-11-15 02:55:08 +08:00
    import

    try:
    reload(sys)
    sys.setdefaultencoding("utf-8")
    except:
    pass

    试一下看看
    XYxe
        6
    XYxe  
       2016-11-15 08:14:00 +08:00
    @TaMud Python3 没有 reload 吧
    jhaohai
        7
    jhaohai  
       2016-11-15 08:58:27 +08:00 via iPhone
    不要在 win 下搞这些,你会生不如死
    justou
        8
    justou  
       2016-11-15 09:09:12 +08:00
    如果不想去动 CMD, 且控制台输出仅做简单观测可以这样:

    # -*- encoding: utf-8 -*-

    import locale
    lc = locale.getpreferredencoding()

    s = 'GBK 控制台不能完全显示的表情(*●●)'


    def show_msg(msg):
    # print(msg) # 注释掉后: UnicodeEncodeError: 'gbk' codec can't encode ...
    print(msg.encode(lc, 'ignore').decode(lc))

    show_msg(s) # GBK 控制台不能完全显示的表情(*●●)

    这将忽略掉本地编码不能显示的字符, 如果要精确记录就用 utf8 编码输出到文件
    init
        9
    init  
       2016-11-15 09:29:19 +08:00
    别用 win 写 python 我就遇到这个坑,没解决,后来又遇到许多安装包无法安装的坑,解决了一部分
    最后的解决方法
    装了个 ubuntu 。。。
    真心的装个 linux 吧不然后面会遇到更多的坑的
    domino
        10
    domino  
    OP
       2016-11-15 09:58:48 +08:00
    感谢各位协助~因刚买了一本网路采集在学 py,问题比较多.

    再请问下,难道 python抓取的 html 含有简体 /繁体
    一定都得在 IDLE 上运行,才不会有编码的问题吗?

    不知道是否有没通用的方法,不用 chcp 65001 ,让 CMD 可以顺利显示各种语言.
    这样脚本给别人,在 win 运行也方便.
    mahone3297
        11
    mahone3297  
       2016-11-15 10:06:32 +08:00
    不是混充跨平台码?

    看到大家说换到 linux 上。我之前,在 win 上写脚本,脚本功能是想 move 一些文件。然后,目录是中文。
    问题:如果我的 php 脚本是 utf8 编码,那没效,因为目录名包含中文, win 上是 gbk 编码
    最后我的解决方案是,在 linux 上挂在 win 解决。大家有其他解决方案码?
    imn1
        12
    imn1  
       2016-11-15 10:20:04 +08:00
    “给别人用”本身就不方便,别人还要配相同 py 环境
    不同 win 的 codepage 编码就更加了

    通用方法
    1.统一环境开发
    2.程序内部做兼容转码
    3.统一使用环境( cmd 注册表改成 65001 ),但这个影响用户其他 cmd 使用
    4.win10/ bash on ubuntu on windows
    imn1
        13
    imn1  
       2016-11-15 10:23:17 +08:00   1
    @mahone3297
    我就是 win 从 php4 等到 php5.3 都没有 unicode 处理目录,才开始学 python 的
    Arnie97
        14
    Arnie97  
       2016-11-15 10:25:00 +08:00 via Android
    @TaMud @XYxe
    加上 from importlib import reload 基本上就是楼主需要的答案

    @justou 你说的方案在大多数场景下很好用,但不适合楼主。他的系统代码页是繁体,会导致很多简体字显示不出来,而不只是几个无关紧要的符号
    raysonx
        15
    raysonx  
       2016-11-15 10:42:41 +08:00
    Windows 默认命令行的锅,用 PowerShell 吧。
    mahone3297
        16
    mahone3297  
       2016-11-15 11:19:45 +08:00
    @imn1 所以, python 能完美解决这个问题是么?我去试试
    imn1
        17
    imn1  
       2016-11-15 11:28:21 +08:00   1
    @mahone3297
    补充一下,是 py3 , py3 读取多字节 win 路径是返回 utf-8 的,无需使用 win 的相关模块

    这个知识不知道是否过时:
    win 系统编码很复杂,例如 win 是 cp936(接近于 gbk)编码,如果一个路径含有中文、英文、韩文,它是一个混合编码,一般需要一些 win 相关的模块处理
    py3 能统一返回 utf-8
    qweweretrt515
        18
    qweweretrt515  
       2016-11-15 11:51:22 +08:00
    t/320624 同病相怜,借地方求助下
    TaMud
        19
    TaMud  
       2016-11-15 14:34:10 +08:00
    关键的一句
    sys.setdefaultencoding("utf-8")
    剩下的自已查手册文 档就行了
    jy02201949
        20
    jy02201949  
       2016-11-15 14:57:19 +08:00   1
    @qweweretrt515 我觉得在 win 下调试代码最好还是用虚拟机, bash on ubuntu on win 应该也能解决这个问题,不过我没用过,好多人用过都说不错,可以在 win 上跑很多 linux 的东西了
    imcocc
        21
    imcocc  
       2016-11-15 15:46:03 +08:00 via iPhone
    @domino 你是下载个 pycharm 社区版的 免费。功能够用。 能省很多事。
    domino
        22
    domino  
    OP
       2016-11-15 20:26:30 +08:00
    @imcocc 感谢,目前使用 IDLE (Python 3.5 32-bit).
    Arthur2e5
        23
    Arthur2e5  
       2016-11-16 02:21:09 +08:00
    @domino chcp 65001 *就是* 你在找的通用方法,句号。

    @mahone3297 人生苦短,多手动用 u"你好中文"(当然用 __future__ unicode_literals 也是好事。)
    practicer
        24
    practicer  
       2016-11-16 10:46:05 +08:00
    解决响应文本编码问题, 用 requests 包更方便

    import requests
    from bs4 import BeautifulSoup
    html = requests.get("http://home.baidu.com/")
    soup = BeautifulSoup(html.content.decode('utf-8'), "lxml")
    print(soup.title);
    domino
        25
    domino  
    OP
       2016-11-16 15:33:50 +08:00
    @practicer
    这还是不能,
    你的系统是简体,你去抓个繁体网页看看.
    应该会出错.
    Septembers
        26
    Septembers  
       2016-11-16 17:18:26 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     926 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 22:50 PVG 06:50 LAX 15:50 JFK 18:50
    Do have faith in what you're doing.
    ubao 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