この質問に対する完全な答えは、さまざまなアップストリームシステムで使用されるエンコーディングの範囲、ユーザーがテキストフィールドに魔法の文字シーケンスを入力するための指示にどの程度準拠するか、どの程度熟練するかなど、多くの要因によって異なります。不明瞭なキーボードの組み合わせで、魔法の文字シーケンスを入力します。
一部のユーザーのみが入力できる非常に簡単な文字シーケンスがいくつかあります。キリル文字のキーボードとエンコーディングを使用しているユーザーのみが「Ильи́ч」(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番目のものはテキストの一部のままです。