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 に答える