1. ホーム
  2. python

[解決済み] Pythonがエンコードできるすべてのエンコーディングのリストを取得します。

2023-03-26 13:23:32

質問

Python 2.6で、多くの異なるエンコーディングにバイトをエンコードしようとするスクリプトを書いています。利用可能なエンコーディングのリストを取得し、それを繰り返し使用する方法はありますか?

私がこれをしようとしている理由は、ユーザーが正しくエンコードされていないいくつかのテキストを持っているからです。おかしな文字があります。私は、それを台無しにしている unicode 文字を知っています。あなたのテキストエディタはその文字列をYエンコーディングではなくXエンコーディングとして解釈しています」というような答えを返せるようにしたいのです。あるエンコードを使用してその文字をエンコードし、別のエンコードを使用して再度デコードし、同じ文字シーケンスが得られるかどうかを確認しようと考えました。

すなわち、次のようなものです。

for encoding1, encoding2 in itertools.permutation(encodinglist(), 2):
  try:
    unicode_string = my_unicode_character.encode(encoding1).decode(encoding2)
  except:
    pass

どのように解決するのですか?

残念ながら encodings.aliases.aliases.keys() は適切な答えではありません。

aliases は、(予想通り) 異なるキーが同じ値にマップされるいくつかのケースを含んでいます。 1252windows_1252 はどちらも cp1252 . もし aliases.keys() の代わりに set(aliases.values()) .

が、もっと悪い問題があります。 aliases にはエイリアスを持たないコーデック (cp856, cp874, cp875, cp737, koi8_u など) が含まれていないのです。

>>> from encodings.aliases import aliases
>>> def find(q):
...     return [(k,v) for k, v in aliases.items() if q in k or q in v]
...
>>> find('1252') # multiple aliases
[('1252', 'cp1252'), ('windows_1252', 'cp1252')]
>>> find('856') # no codepage 856 in aliases
[]
>>> find('koi8') # no koi8_u in aliases
[('cskoi8r', 'koi8_r')]
>>> 'x'.decode('cp856') # but cp856 is a valid codec
u'x'
>>> 'x'.decode('koi8_u') # but koi8_u is a valid codec
u'x'
>>>

コーデックの完全なリストをどのように入手しようとも、文字セットのエンコード/デコードに関係なく、他の変換を行うコーデックを無視するのは良い考えかもしれないことにも注意してください。 zlib , quopri そして base64 .

ここで、なぜバイトを多くの異なるエンコーディングにエンコードしてみたいのか、という疑問が湧いてきます。もし私たちがそれを知っていれば、正しい方向に導くことができるかもしれません。

まず第一に、それはあいまいです。1 つはバイトを unicode に DEcode し、もう 1 つは unicode をバイトに ENcode します。あなたはどちらをやりたいのでしょうか?

あなたは本当に何を達成しようとしているのでしょう。いくつかの受信バイトをデコードするためにどのコーデックを使用するかを決定しようとしており、すべての可能なコーデックでこれを試みることを計画していますか? [注意: latin1 は何でもデコードします] ある unicode テキストの言語を、可能なすべてのコーデックでエンコードしようとしているのでしょうか。[注:utf8は何でもエンコードします]。