扭曲的服务器返回带有意外字体的文本

Twisted server returning text with unexpected fonts

我当前扭曲的服务器代码。这是一个简单的实验,采用 url 编码请求并将它们转换为 JSON 之类的字符串,然后 return.

from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor
import urllib.parse

class FormPage(Resource):
    isLeaf = True
    def render_GET(self, request):
        print(request.uri)
        x = (request.uri).decode('ascii')
        x = x[1:]
        x = todi(x)
        return x.encode('ascii')
def todi(st):
    if len(st) == 0:
        return '{}'
    if st[len(st)-1] == '/':
        st = st[:-1]
    if len(st) == 0:
        return '()'
    if st[0] == '?':
        st = st[1:]
    st = urllib.parse.parse_qsl(st)
    return str(dict(st))



factory = Site(FormPage())
reactor.listenTCP(80, factory)
reactor.run()

我注意了接收简单文本时浏览器显示的字体。例如这个站点: http://icanhazip.com/ 当你访问时,字体看起来像 consola 字体(MS记事本的默认字体)。但是,当我访问我的网站时,我的浏览器显示的字体类似于 Times New Roman.

此后我进行了一些调试,例如强制网站 return 一个简单的字符串,但没有什么能阻止 twisted 给我丑陋的字体。

在这里,有一个example

另请注意,我在 Chrome 中执行了操作,您可以在其中右键单击并使用 "View page source" 按钮。相信我,我的两个例子都是根据那个简单的原始文本。

查看您的 Twisted 服务器返回的 headers 并将它们与其他网站返回的那些进行比较,后者指定 Content-Type: text/plain; charset=UTF-8,而 Twisted 服务器未指定 Content-Type 完全没有。

当内容类型指定为 text/plain 与未指定的内容类型时,您的浏览器(我发现它与 Firefox 相同)使用不同的字体。

在 Twisted 中,您可以像这样用 request.setHeader() 设置 Content-Type header:

def render_GET(self, request):
    print(request.uri)
    x = (request.uri).decode('ascii')
    x = x[1:]
    x = todi(x)
    request.setHeader('Content-Type', 'text/plain; charset=UTF-8')
    return x.encode('UTF-8')

因为这设置了 Content-Type,所以它也可以指定字符集。 UTF-8(可能)是首选,并且响应文本的编码方式类似。