Python CGI 中文显示问题 - 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
insolo
V2EX    Python

Python CGI 中文显示问题

  •  
  •   insolo 2015-12-08 15:03:26 +08:00 5752 次点击
    这是一个创建于 3674 天前的主题,其中的信息可能已经有所发展或是发生改变。
    业余新手学习过程中碰到的小问题
    如下代码,字符串中出现中文浏览器就无法正确显示, google N 久没搞清楚怎么处理,求各位高手指点

    #!/usr/bin/python
    #-*- coding: UTF-8 -*-
    import cgi
    import cgitb
    print("Content-Type: text/html; charset=")
    print("")
    a = "中文"
    print(a)
    18 条回复    2015-12-11 21:56:24 +08:00
    TheCure
        1
    TheCure  
       2015-12-08 15:17:34 +08:00
    a = u '中文'
    hcwhan
        2
    hcwhan  
       2015-12-08 15:36:26 +08:00
    @callofmx 看 print(a)是 python3
    insolo
        3
    insolo  
    OP
       2015-12-08 15:41:38 +08:00
    @callofmx
    将#!/usr/bin/python 改为#!/usr/bin/python2 浏览器可以正常输出内容

    默认的 Python 版本是 3.4.3 , Python2 的版本是 2.7.6
    加上 u 之后浏览器端两个版本都没有显示内容,也没有报错
    交互环境下 Python2 及 python3 都能正常输出内容
    insolo
        4
    insolo  
    OP
       2015-12-08 15:43:57 +08:00
    @hcwhan python3 有什么不一样的讲究吗?
    oyjc
        5
    oyjc  
       2015-12-08 16:19:07 +08:00
    python3 默认输出的不是字节文本,所以,

    print(a.encode())
    est
        6
    est  
       2015-12-08 16:27:25 +08:00
    1. 不要学习 cgi 。这玩意是上个世纪的。
    2. 不要在 windows 下用 py 。
    clino
        7
    clino  
       2015-12-08 16:34:37 +08:00
    楼主确认你的源代码文件真的是 utf8 的?
    insolo
        8
    insolo  
    OP
       2015-12-08 17:26:30 +08:00
    @oyjc 加上 encode()后有内容输出,但是字节码没法读~

    加上下面的代码后搞定了,虽然不是太理解机制是什么,谢谢各位
    import codecs, sys
    sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)
    wizardoz
        9
    wizardoz  
       2015-12-08 17:36:41 +08:00
    居然用 CGI
    fy
        10
    fy  
       2015-12-08 18:16:17 +08:00
    楼主,没记错的话 Content-Type: text/html; charset= 是不靠谱的。

    编码是在<html><head>里面里面的那个
    gamexg
        11
    gamexg  
       2015-12-08 18:20:41 +08:00 via Android
    windows ?
    print 时会自动根据环境转码的,猜测你的环境不是 utf8 ,所以转出来的不是 utf8 编码。
    用手机不方便查,记得 sys 库可以查看系统编码,应该不是 utf8 。
    neoblackcap
        12
    neoblackcap  
       2015-12-08 20:03:19 +08:00
    Python 有自己的网关接口标准,叫 WSGI ,去看看具体的标准才再开始。

    而且切莫重复造轮子,已经有很多 WSGI server ,一般人就是写个 application 的 callback 而已。
    neoblackcap
        13
    neoblackcap  
       2015-12-08 20:07:42 +08:00
    还有就是显示不出来主要就是编码错误, Python 3 的那个字符串语法那默认是生成 Unicode object 。在输出的时候我们是需要一个二进制的字符串,若非 ascii 的字符串,则会发生解码错误,导致显示不出来(还有的就是你的终端可能不支持对应的编码)。若想正确输出, Python3 在输出前请手动编码一次。
    Zzzzzzzzz
        14
    Zzzzzzzzz  
       2015-12-08 20:29:39 +08:00
    @fy 不, 仅仅是 http resp headers 里 content-type 段没有指明编码的情况下, http meta 里指明的编码才有用.
    Zzzzzzzzz
        15
    Zzzzzzzzz  
       2015-12-08 20:30:11 +08:00
    后面一个"http meta"是"html meta", 打错了.
    fasling
        16
    fasling  
       2015-12-08 20:30:38 +08:00
    @est 我最近写的一个玩具程序,在 windows 上跑就好好的,在 mac 上一会儿就各种问题.不知道是我写的问题还是库的问题.大部分挂的时候是在调用 pycurl
    yh7gdiaYW
        17
    yh7gdiaYW  
       2015-12-08 21:08:51 +08:00
    这种问题应该找百度...
    julyclyde
        18
    julyclyde  
       2015-12-11 21:56:24 +08:00
    @insolo codecs.getwriter 这个需要执行,说明你在用 Windows

    你从一开始就错了……哪儿有用 Windows 做互联网服务的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5339 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 08:44 PVG 16:44 LAX 00:44 JFK 03:44
    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