12

makoテンプレートを使用して、特殊な構成ファイルを生成しています。これらのファイルの一部には拡張ASCII文字(> 127)が含まれていますが、makoは、使用すると文字が範囲外であると言って窒息します。

## -*- coding: ascii -*-

だから私はおそらく次のようなものがあるのだろうかと思っています:

## -*- coding: eascii -*-

私が使用できることは、range(128、256)文字で問題ありません。

編集:

ファイルの問題のあるセクションのダンプは次のとおりです。

000001b0  39 c0 c1 c2 c3 c4 c5 c6  c7 c8 c9 ca cb cc cd ce  |9...............|
000001c0  cf d0 d1 d2 d3 d4 d5 d6  d7 d8 d9 da db dc dd de  |................|
000001d0  df e0 e1 e2 e3 e4 e5 e6  e7 e8 e9 ea eb ec ed ee  |................|
000001e0  ef f0 f1 f2 f3 f4 f5 f6  f7 f8 f9 fa fb fc fd fe  |................|
000001f0  ff 5d 2b 28 27 73 29 3f  22 0a 20 20 20 20 20 20  |.]+('s)?".      |
00000200  20 20 74 6f 6b 65 6e 3a  20 57 4f 52 44 20 20 20  |  token: WORD   |
00000210  20 20 22 5b 41 2d 5a 61  2d 7a 30 2d 39 c0 c1 c2  |  "[A-Za-z0-9...|
00000220  c3 c4 c5 c6 c7 c8 c9 ca  cb cc cd ce cf d0 d1 d2  |................|
00000230  d3 d4 d5 d6 d7 d8 d9 da  db dc dd de df e0 e1 e2  |................|
00000240  e3 e4 e5 e6 e7 e8 e9 ea  eb ec ed ee ef f0 f1 f2  |................|
00000250  f3 f4 f5 f6 f7 f8 f9 fa  fb fc fd fe ff 5d 2b 28  |.............]+(|

makoが文句を言う最初の文字は000001b4です。このセクションを削除すると、すべて正常に機能します。セクションが挿入されると、makoは次のように文句を言います。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 19: ordinal not in range(128)

マジックコメント行で「ascii」を使用しても「latin-1」を使用しても同じ苦情です。

ありがとう!

グレッグ

4

3 に答える 3

19

簡潔な答え

レトロな DOS を楽しむには、エンコーディングとして cp437 を使用します。127 を除く 10 進数で 32 以上のすべてのバイト値は、このエンコーディングで表示可能な文字にマップされます。次に、本当にトリッピーな時間のエンコーディングとして cp037 を使用します。そして、これらのどちらかが「正しい」としたら、どれが本当に正しいかをどうやって知ることができるかを自問してください.

長い答え

忘れなければならないことがあります。それは、バイト値と文字の絶対的な等価性です。

今日の多くの基本的なテキスト エディターとデバッグ ツール、および Python 言語仕様は、実際には何も存在しない場合でも、バイトと文字の絶対的な同等性を暗示しています。それが「トークン」であることは事実ではありませ74 6f 6b 65 6e 。ASCII 互換の文字エンコーディングに対してのみ、この対応が有効です。今日でもかなり一般的な EBCDIC では、「トークン」はバイト値に対応しますa3 96 92 85 95

したがって、Python 2.6 インタープリターは喜んで として評価'text' == u'text'しますがTrue、そうすべきではありません。なぜなら、それらは ASCII または互換性のあるエンコーディングの仮定の下でのみ同等であり、それでも同等と見なされるべきではないからです。(少なくともそう'\xfd' == u'\xfd'Falseあり、試行すると警告が表示されます。) Python 3.1 は として評価さ'text' == b'text'Falseます。しかし、インタープリターがこの式を受け入れることでさえ、バイト値と文字の絶対的な同等性を意味します。これは、インタープリターがこの式を「 b'text'ASCII エンコーディングを適用したときに得られるバイト文字列」を意味するものと見なすためです'text'

私の知る限り、今日広く使用されているすべてのプログラミング言語は、その設計のどこかで ASCII または ISO-8859-1 (Latin-1) 文字エンコードを暗黙的に使用しています。C では、charデータ型は実際にはバイトです。java.lang.String(byte[] data)コンストラクターが ISO-8859-1 エンコーディングを想定している 1 つの Java 1.4 VM を見ました。ほとんどのコンパイラとインタプリタは、ソース コードの ASCII または ISO-8859-1 エンコーディングを想定しています (変更できるものもあります)。Java では、文字列の長さは実際には UTF-16 コード単位の長さであり、これは文字以上では間違いなく間違っていU+10000ます。Unix では、ファイル名は端末の設定に従って解釈されるバイト文字列であり、open('a\x08b', 'w').write('Say my name!').

したがって、私たちは皆、「A」が0x41であると信じるように、信頼することを学んだツールによって訓練され、調整されてきました。しかし、そうではありません。「A」は文字で、0x41 はバイトであり、単純に等しくありません。

この点について悟れば、問題を解決するのに何の問題もありません。ソフトウェアのどのコンポーネントがこれらのバイト値の ASCII エンコーディングを想定しているか、その動作を変更する方法、または代わりに別のバイト値が表示されるようにする方法を決定する必要があります。

PS: 「拡張 ASCII」と「ANSI 文字セット」というフレーズは誤称です。

于 2011-07-27T23:03:01.837 に答える
3

試す

## -*- coding: UTF-8 -*-

また

## -*- coding: latin-1 -*-

また

## -*- coding: cp1252 -*-

本当に必要なものに応じて。最後の 2 つは似ていますが、次の点を除きます。

Windows-1252 コードページは、ほとんど使用されていない C1 コントロールが追加の文字に置き換えられている 128 ~ 159 (hex 80 ~ 9F) の範囲を除くすべてのコードについて、ISO-8859-1 と一致します。Windows-28591 は、実際の ISO-8859-1 コードページです。

ISO-8859-1の正式名称はどこですかlatin-1

于 2011-07-27T20:03:08.757 に答える
1

批判的な目でデータを調べてみてください。

000001b0 39 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce | 9 ............... |
000001c0 cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de | ................ |
000001d0 df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee | ................ |
000001e0 ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe | ................ |
000001f0 ff 5d 2b 28 27 73 29 3f 22 0a 20 20 20 20 20 20|。]+('s)?"。|
00000200 20 20 74 6f 6b 65 6e 3a 20 57 4f 52 44 20 20 20 |トークン:WORD |
00000210 20 20 22 5b 41 2d 5a 61 2d 7a 30 2d 39 c0 c1 c2 | "[A-Za-z0-9 ... |
00000220 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 | ................ |
00000230 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 | ................ |
00000240 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 | ................ |
00000250 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 5d 2b 28 | .............] +(|

太字のフォントは2ロットです(0xc0から0xffまでの各バイトを含む)。テキストファイルではなく、バイナリファイル(おそらくコンパイルされた正規表現のダンプ)があるようです。Pythonソースファイルに貼り付けるのではなく、バイナリファイルとして読み取ることをお勧めします。また、makoのドキュメントを読んで、何が期待されているかを確認する必要があります。

ダンプのテキスト部分を確認した後の更新:これはASCIIのみの正規表現で表現できる可能性があります。たとえば、次のような行があります。

token: WORD "[A-Za-z0-9\xc0-\xff]+(etc)etc"
于 2011-07-28T02:11:14.497 に答える