5

100ほどの送信者のそれぞれが使用しているエンコーディングを知らなくても、バイトストリームをUnicode文字にデコードしています。

送信者の多くは技術的に鋭敏ではなく、使用しているエンコーディングを教えてくれません。これは、データの生成に使用しているツールチェーンの発生状況によって決まります。

送信者は、現時点ではすべて英国/英語ベースで、さまざまなオペレーティングシステムを使用しています。

すべての送信者に、各送信者が使用しているエンコーディングを明確に示す特定の文字列を送信するように依頼できますか?

ヒューリスティックを使用してエンコーディングを推測するライブラリがあることを理解しています-ランタイムフォールバックとしてそれも追跡しますが、可能であれば、最初にどのエンコーディングが使用されているかを確認したいと思います。

(関連性があるとは思わないが、私はPythonで作業している)

4

1 に答える 1

4

この質問に対する完全な答えは、さまざまなアップストリームシステムで使用されるエンコーディングの範囲、ユーザーがテキストフィールドに魔法の文字シーケンスを入力するための指示にどの程度準拠するか、どの程度熟練するかなど、多くの要因によって異なります。不明瞭なキーボードの組み合わせで、魔法の文字シーケンスを入力します。

一部のユーザーのみが入力できる非常に簡単な文字シーケンスがいくつかあります。キリル文字のキーボードとエンコーディングを使用しているユーザーのみが「Ильи́ч」(Ilyich)と簡単に入力できるため、UTF-8、UTF-16、iso8859_5、koi8_rなどのキリル文字対応のエンコーディングを区別するだけで済みます。同様に、日本語、簡略化された中国語、繁体字中国語、および韓国語のシステムのユーザーを区別する、日本語、中国語、および韓国語の文字シーケンスを思い付くことができます。

ただし、西ヨーロッパのコンピューターシステムのユーザーと、ISO-8859-15、Mac_Roman、UTF-8、UTF-16LE、UTF-16BEなどの一般的なエンコーディングに焦点を当てましょう。非常に簡単なテストは、ユーザーにユーロ文字「€」、U + 20ACを入力させ、どのバイトシーケンスが生成されるかを確認することです。

  • バイト['\xa4']はiso-8859-15エンコーディングを意味します
  • バイト['\xe2'、'\ x82'、'\xac']はutf-8エンコーディングを意味します
  • バイト['\x00'、'\xac']はutf-16beエンコーディングを意味します
  • バイト['\xac'、'\x00']はutf-16leエンコーディングを意味します
  • バイト['\x80']は、cp1252( "Windows ANSI")エンコーディングを意味します
  • バイト['\xdb']はマクロマンエンコーディングを意味します
  • iso-8859-1は、ユーロの文字をまったく表すことができません。iso-8859-15は、iso-8859-1のユーロをサポートする後継機です。
  • 米国のユーザーは、おそらくユーロ記号の入力方法を知らないでしょう。(わかりました、それはあまりにも卑劣です。彼らの3%は知っているでしょう。)

可能なエンコーディングのいずれかとして解釈されるこれらのバイトシーケンスのそれぞれが、ユーザーが自分で入力する可能性のある文字シーケンスではないことを確認する必要があります。たとえば、iso-8859-15ユーロ記号の「\ xa4」は、「¤」のiso-8859-1またはcp1252またはUTF-16leエンコーディング、「§」のマクロマンエンコーディング、または最初のバイトにすることもできます。 U + A4xxYiSyllablesやU+01A4 LATIN SMALL LETTER OIなど、数千のUTF-16文字のいずれか。これは、UTF-8シーケンスの有効な最初のバイトではありません。一部のユーザーがYiでテキストを送信する場合は、問題が発生している可能性があります。

Python 3.xのドキュメント、7.2.3。Standard Encodingsには、Python標準ライブラリが簡単に処理できる文字エンコードがリストされています。次のプログラムでは、テスト文字シーケンスがさまざまなエンコードによってバイトにエンコードされる方法を確認できます。

>>> for e in ['iso-8859-1','iso-8859-15', 'utf-8', 'utf-16be', 'utf-16le', \
... 'cp1252', 'macroman']:
...     print e, list( euro.encode(e, 'backslashreplace'))

したがって、便利で満足のいくハックとして、エンコーディングに問題がある場合は、テキストフィールドの最初の文字として「€」を入力するようにユーザーに指示することを検討してください。次に、システムは上記のバイトシーケンスのいずれかをエンコードの手がかりとして解釈し、それらを破棄する必要があります。ユーザーがテキストコンテンツをユーロ文字で開始する場合は、フィールドを「€€」で開始します。最初のものは飲み込まれ、2番目のものはテキストの一部のままです。

于 2012-11-18T06:18:32.447 に答える