尝试在浏览器中打印欧元符号:在终端上成功打印但不在浏览器上打印 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.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!
€
This string includes a € sign
end
Python 3.4.0 (default, Apr 11 2014, 13:05:18)
[GCC 4.8.2] on linux
答案 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("€")
:
#!/usr/bin/python3
import cgitb
cgitb.enable()
print("Content-Type: text/html;charset=utf-8")
print()
print(
"<!DOCTYPE html>"
"<html>"
"<body>"
"€"
"</body>"
"</html>")
这更安全。
您不必像在脚本中那样使用编码方法。当然,它不会在终端中看起来正确,但您的浏览器会正确显示它。
请记住,您必须打印一个空行以从其余部分中分隔标题。之后你只需要打印常规的HTML。