1

我正在尝试制作一个程序:

  • 从文件中读取中文字符列表,从中创建字典(将符号与其含义相关联)。
  • BaseHTTPServer选择一个随机字符并在收到 GET 请求时使用该模块将其发送到浏览器。

一旦我设法正确读取和存储标志(我尝试将它们写入另一个文件以检查它们是否正确并且有效),我无法弄清楚如何将它们发送到我的浏览器。

我连接到 127.0.0.1:4321 并且我管理的最好的方法是获得一个(据说)url 编码的中文字符及其翻译。

代码:

# -*- coding: utf-8 -*-
import codecs
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
import threading
import random
import urllib

source = codecs.open('./signs_db.txt', 'rb', encoding='utf-16')

# Checking utf-16 works fine with chinese characters and stuff :
#out = codecs.open('./test.txt', 'wb', encoding='utf-16')
#for line in source:
#   out.write(line)

db = {}
next(source)
for line in source:
    if not line.isspace():
            tmp = line.split('\t')
            db[tmp[0]] = tmp[1].strip()

class Handler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        message =  threading.currentThread().getName()
        rKey = random.choice(db.keys())
        self.wfile.write(urllib.quote(rKey.encode("utf-8")) + ' : ' + db[rKey])
        self.wfile.write('\n')
        return

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""

if __name__ == '__main__':
    server = ThreadedHTTPServer(('localhost', 4321), Handler)
    print 'Starting server, use <Ctrl-C> to stop'
    server.serve_forever()

如果我不对汉字进行 urlencode,我会从 python 得到一个错误:

self.wfile.write(rKey + ' : ' + db[rKey])

这给了我这个:

UnicodeEncodeError:'ascii'编解码器无法在位置 0 编码字符 u'\u4e09':序数不在范围内(128)

我也尝试过使用 'utf-16' 进行编码/解码,但我仍然收到那种错误消息。

这是我的测试文件:

Sign    Translation

一   One
二   Two
三   Three
四   Four
五   Five
六   Six
七   Seven
八   Eight
九   Nine
十   Ten

所以,我的问题是:“我怎样才能让来自我的脚本的汉字在我的浏览器中正确显示”?

4

1 回答 1

5

通过编写元标记来声明页面的编码,并确保将整个 Unicode 字符串编码为 UTF-8:

self.wfile.write(u'''\
    <html>
    <headers>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
    </headers>
    <body>
    {} : {}
    </body>
    </html>'''.format(rKey,db[rKey]).encode('utf8'))

和/或声明 HTTP 内容类型:

self.send_response(200)
self.send_header('Content-Type','text/html; charset=utf-8')
self.end_headers()
于 2013-01-05T17:34:35.970 回答