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 · 5421 次点击
    这是一个创建于 3302 天前的主题,其中的信息可能已经有所发展或是发生改变。
    业余新手学习过程中碰到的小问题
    如下代码,字符串中出现中文浏览器就无法正确显示, google N 久没搞清楚怎么处理,求各位高手指点

    #!/usr/bin/python
    #-*- coding: UTF-8 -*-
    import cgi
    import cgitb
    print("Content-Type: text/html; charset=utf-8")
    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=utf-8 是不靠谱的。

    编码是在<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   ·   实用小工具   ·   899 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:05 · PVG 06:05 · LAX 14:05 · JFK 17:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.