2

私は無料のWebホストを使用していますが、Pythonフレームワークを使用しないことを選択しており、ソースファイルに保存されている漢字を(utf-8でエンコードされたファイルを保存するためにemacsを使用して)結果のHTMLページに印刷しようとして立ち往生しています。UnicodeはPython3.1で「正しく機能する」と思っていたので、困惑しました。うまくいかない3つの解決策を見つけました。詳細が1つか2つ欠けているだけかもしれません。

ホストはAlwaysdataで、使い方は簡単なので、パーツの組み立て方の詳細についてはほとんどわかりません。私がしているのは、Pythonファイルをwwwフォルダーにアップロードまたは編集し(sshを使用して)、アクセス許可を変更し、ブラウザーで正しいURLを指定するだけです。

私の最初の試みは、ローカルIDLE(およびサーバーのPythonコマンドラインインタラクティブシェルでも機能します。これにより、ブラウザーに渡されたときに機能しない理由がさらに混乱します)

#!/usr/bin/python3.1

mystr = "世界好"
print("Content-Type: text/html\n\n")
print("""<!DOCTYPE html>
<html><head><meta charset="utf-8"></head>
<body>""")

print(mystr)

エラーは次のとおりです。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: 
ordinal not in range(128)

それから私は試しました

print(mystr.encode("utf-8"))

エラーは発生しませんが、ブラウザへの望ましくない出力は次のとおりです。

b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'

3番目に、次の行が追加されましたが、エラーが発生しました。

import sys
sys.setdefaultencoding("utf-8")

AttributeError: 'module' object has no attribute 'setdefaultencoding'

最後に、printをf.writeに置き換えます。

import codecs
f = codecs.open(sys.stdout, "w", "utf-8")

mystr = "你好世界"
...
f.write(mystr)

エラー:

TypeError: invalid file: <_io.TextIOWrapper name='<stdout>' 
encoding='ANSI_X3.4-1968'>

出力を機能させるにはどうすればよいですか?迅速な修正のためにフレームワークを使用する必要がありますか?

4

1 に答える 1

2

人間への出力用に作成されたstdoutを使用してブラウザに出力するため、愚かなAPIであるCGIを使用しているようです。これが問題の基本的な原因です。

それをUTF-8でエンコードしてから、sys.stdoutではなくsys.stdout.bufferに書き込む必要があります。

その後、Webフレームワークを取得します。本当に、あなたはとても幸せになるでしょう。

于 2012-04-04T16:54:03.710 に答える