0

从本地控制台运行时会打印“Test: £17”,但从 Web 浏览器运行时只会打印“Test:”。通过浏览器加载时如何纠正问题?谢谢!

#!/usr/bin/python3.2
print ("Content-Type: text/html")
print ("")

y = "£17"
print ("Test:", y)
4

1 回答 1

4

打印到控制台时,Python 会将 unicode 值编码为字节。

发送到浏览器时显式编码,直接写入sys.stdout

#!/usr/bin/python3.2
import sys
out = sys.stdout
out.write(b"Content-Type: text/html; charset=utf8\r\n")
out.write(b"\r\n")

y = "£17"
out.write("Test: {0}\r\n".format(y).encode(encoding='utf8'))

请注意,HTTP 标头实际上应该使用\r\n(回车,换行)组合。我还添加了用于Content-Type标头的编码,以便浏览器知道如何再次对其进行解码。

对于 HTML,您确实希望使用字符实体引用而不是 Unicode 代码点:

y = "£17"
out.write("Test: {0}\r\n".format(y).encode(encoding='utf8'))

此时您也可以只使用 ASCII 作为编码。

如果您真的,真的,真的想使用,请使用正确的编码print()重新打开:stdout

utf8stdout = open(1, 'w', encoding='utf-8', closefd=False) # fd 1 is stdout

print("Content-Type: text/html; charset=utf8", end='\r\n', file=utf8stdout)
print("", end='\r\n', file=utf8stdout)

y = "£17"
print("Test:", y, end='\r\n', file=utf8stdout)

您可以通过以下方式简化它functools.partial()

from functools import partial
utf8print = partial(print, end='\r\n', file=utf8stdout)

然后使用utf8print()没有额外的关键字:

utf8print("Content-Type: text/html; charset=utf8")
utf8print("")
# etc.

另请参阅Python Unicode HOWTO以了解有关 Python 如何设置输出编码的详细信息,以及Stack Overflow 上有关打印和编码的这个问题。

于 2012-12-22T15:16:32.040 回答