誰かが私にPythonがこの振る舞いをする理由を説明できますか?
説明させてください。
バックグラウンド
Pythonをインストールしていて、ASCIIテーブルにない文字をいくつか使用したいと思います。そこで、Pythonのデフォルトのエンコードを変更します。そのようにして、すべての文字列をファイル.pyに保存します'_MAIL_TITLE_': u'Бронирование номеров',
ここで、辞書のキーを置き換えるメソッドを使用して、動的な方法で文字列をhtmlテンプレートに挿入したいと思います。
私はhtmlページのヘッダーに配置します:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
...... <!-- Some Css's -->
</head>
残念ながら、私のhtmlドキュメントは(それらが置き換えられた後)いくつかの間違った文字(変換されていない?誤って変換された?)で私に届きます
それで、私はターミナルを開いて、いくつかの注文をし始めます:
1 - Python 2.4.6 (#1, Jan 27 2012, 15:41:03)
2 - [GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
3 - Type "help", "copyright", "credits" or "license" for more information.
4 - >>> import sys
5 - >>> sys.getdefaultencoding()
6 - 'utf-8'
7 - >>> u'èéòç'
8 - u'\xe8\xe9\xf2\xe7'
9 - >>> u'èéòç'.encode('utf-8')
10 - '\xc3\xa8\xc3\xa9\xc3\xb2\xc3\xa7'
11 - >>> u'è'
12 - u'\xe8'
13 - >>> u'è'.encode()
14 - '\xc3\xa8'
質問
行[7-10]を見てください。変じゃない?私の(6行目)Pythonにdefaultencodingがある場合、utf-8
9行目とは異なる方法でその文字列(7行目)を変換するのはなぜですか?次に、行[11-14]とその出力を見てください。
今、私は完全に混乱しています!
ヒント
そこで、入力ファイルの端末の方法(以前はISO-8859-1、現在はutf-8 )を変更しようとしましたが、何かが変更されました。
1 - Python 2.4.6 (#1, Jan 27 2012, 15:41:03)
2 - [GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
3 - Type "help", "copyright", "credits" or "license" for more information.
4 - >>> import sys
5 - >>> sys.getdefaultencoding()
6 - 'utf-8'
7 - >>> u'èéòç'
8 - u'\xc3\xc3\xa8\xc3\xa9\xc3\xb2\xc3\xa7'
9 - >>> u'èéòç'.encode('utf-8')
10 - '\xc3\xa8\xc3\xa9\xc3\xb2\xc3\xa7'
11 - >>> u'è'
12 - u'\xe8'
13 - >>> u'è'.encode()
14 -'\xc3\xa8'
したがって、エンコーディング(明示的なエンコーディング)は入力エンコーディングとは独立して機能します(または、私には思えますが、これに何日も立ち往生しているので、頭がおかしくなったかもしれません)。
解決策はどこにありますか?
との8行目を見るbackground
とhint
、作成されたUnicodeのオブジェクトにいくつかの違いがあることがわかります。それで、私はそれについて考え始めました。私は何を結論付けましたか?何もない。おそらく、私の.py(htmlドキュメントに挿入する必要のあるすべてのutf-8文字が含まれている)を保存すると、私のエンコーディングの問題がファイルのエンコーディングにあること以外は何もありません
「本当の」コード
このコードは特別なことは何もしません。htmlテンプレートを開き、文字列に配置し、プレースホルダーをユニコード(utf-8ed?wish yes)文字列に置き換え、インターネットから視覚化される別のファイルに保存します(yes、my "ランディング」ページは、ヘッダーutf-8の仕様に含まれています)。いくつかのファイルに散在しているため、ここにはコードがありませんが、プログラムのワークフローは確かです(トレースすることで)。
最後の質問
これに照らして、誰かが私のコードを機能させるためのアイデアを持っていますか?UNIXファイルエンコーディングについてのアイデア?または.pyファイルエンコーディング?コードを機能させるためにエンコーディングを変更するにはどうすればよいですか?
最後のヒント
プレースホルダーをutf-8オブジェクトに置き換える前に、
utf8Obj.encode('latin-1')
私のドキュメントはインターネットで完全に表示されます!
答えてくれた人たちに感謝します。
編集1-開発ワークフロー
これが私の開発ワークフローです。
そのプロジェクトのCVSがあります。プロジェクトはcentosOS上にあります。そのサーバーは64ビットマシンです。コードをEclipse付きのWindows7(64ビット)に開発します。すべての変更は、CVSコミットでのみコミットされます。このコードは、その種のPythonを使用するCentosマシンに適用されます。
Python 2.4.6 (#1, Jan 27 2012, 15:41:03)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
私はEclipseをそのように動作するように設定しました:PREFERENCES-> GENERAL-> WORKSPACE-> TEXT FILE ENCODING:UTF-8
Zope / Ploneアプリケーションは同じサーバー上で実行されます:それはいくつかのPHPページを提供します。PHPページは、Zope / Ploneの「サーバー」にあるWSによるいくつかのPythonメソッド(アプリケーションロジック)を呼び出します。そのサーバーは、アプリケーションロジックに直接接続します。
それで全部です
EDIT2
これは、置換を行う関数です。
def _fillTemplate(self, buf):
"""_fillTemplate(buf)-->str
Ritorna il documento con i campi sostituiti con dict_template.
"""
try:
for k, v in self.dict_template.iteritems():
if not isinstance(v,unicode):
v=str(v)
else:
v=v.encode('latin-1') #In that way it works, but why?
buf = buf.replace(k, v)