浏览器中的输出与终端char gt128 python3 apache2中的输出不同

时间:2014-11-24 03:05:05

标签: python-3.x apache2 python-unicode

尝试在浏览器中打印欧元符号:在终端上成功打印但不在浏览器上打印 python 2.7和3中的相同行为:更喜欢python 3.4解决方案 浏览器测试了火狐和opera:url localhost / cgi-bin / test2.py 浏览器显示正确编码的页面信息,因此标题必须正常工作 可能与python中的解码指令有些不兼容 可以通过故意混合编码来生成汉字,但不能使它们匹配。 运行通常的LAMP设置;使用PHP没有问题 似乎找到了正确的二进制文件 需要接受任何语言的输入

如何隔离问题?

有人可以为标题发布python 3的正确极简主义代码并打印说欧元符号而不使用html实体吗?我目前的代码

#!/usr//bin/env python3
import cgi
#cgi.test()

import locale
import sys
import os
import io

import codecs

import cgitb
cgitb.enable() #this does not work properly either!!!


lf = chr(10)
cr  = chr(13)

h = "Content-Type: text/html; charset=utf-8 "
#h.encode("ascii")
print(h)
print(' Cache-Control: "no-cache, no-store, must-revalidate"'.encode('utf-8'))
#print(' Pragma: no-cache')
#print(' Expires: 0')
print(cr)
print(lf)

print()
print(lf)
print(cr)
print('<DOCTYPE! html>')
print('<meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=utf-8">')
print('<html><body>')
hw = "Hello World!"
hw.encode('utf-8')
#hw.encode('utf-16le')
print(hw)

euro = "&euro;"
euro.encode('utf-8')
#euro.encode('utf-16')
print(euro) #THIS PRINTS OKAY


u = chr(8364)
u=u'This string includes a \u20AC sign'
u.encode('utf-8')
#u.encode('utf-16le')
print(u) #THIS PRINTS IN TERMINAL, BUT NOT IN BROWSER AND GENERATES FATAL ERROR 

end = "end"
end.encode('utf-8')
#end.encode('utf-16')
print(end)



Terminal output:
Content-Type: text/html; charset=utf-8 
b' Cache-Control: "no-cache, no-store, must-revalidate"'

<DOCTYPE! html>
<meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=utf-8">
<html><body>
Hello World!
&euro;
This string includes a € sign
end


Python 3.4.0 (default, Apr 11 2014, 13:05:18) 
[GCC 4.8.2] on linux

2 个答案:

答案 0 :(得分:0)

可能不是最佳解决方案,但以下至少有效:

u = chr(8364)
#u='This string includes a \u20AC sign'
u=u+'This string includes a \u673A sign'  
out = ''

for ch in u:
    out = out+'&#'+str(ord(ch))+';' 
print(out)

答案 1 :(得分:0)

Python3字符串默认是unicode,但似乎控制台也必须支持unicode。例如:print("€")适用于Linux终端,但不适用于Windows命令行。显然Apache也有类似的问题。您可以尝试直接发送字节:

#!/usr/bin/python3

import sys
import cgitb
cgitb.enable()

print("Content-Type: text/html;charset=utf-8")
print()
sys.stdout.flush()
print(
    "<!DOCTYPE html>"
    "<html>"
    "<body>")
sys.stdout.buffer.write(bytes("€", "utf-8"))
print(
    "</body>"
    "</html>")

或者你可以使用print("&euro;")

#!/usr/bin/python3

import cgitb
cgitb.enable()

print("Content-Type: text/html;charset=utf-8")
print()
print(
    "<!DOCTYPE html>"
    "<html>"
    "<body>"
    "&euro;"
    "</body>"
    "</html>")

这更安全。

您不必像在脚本中那样使用编码方法。当然,它不会在终端中看起来正确,但您的浏览器会正确显示它。

请记住,您必须打印一个空行以从其余部分中分隔标题。之后你只需要打印常规的HTML。