在文件中读取中文字符并将其发送到浏览器

时间:2013-01-05 17:15:13

标签: python http unicode cjk

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

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

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

我连接到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

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

1 个答案:

答案 0 :(得分:5)

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

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()