私は、ユーザーがデータのtxtファイルをアップロードでき、データがdbにインポートされるWebサイトを持っています。ただし、UTF-8でデータをアップロードするユーザーもあれば、UTF-16でアップロードするユーザーもいます。アップロードされたファイルがUTF-8またはUTF-16であるかどうかを調べるにはどうすればよいですか?
ファイルをUTF-16で保存してアップロードすると、そのデータはガーベジです。このような状況にどう対処することができますか?
私は、ユーザーがデータのtxtファイルをアップロードでき、データがdbにインポートされるWebサイトを持っています。ただし、UTF-8でデータをアップロードするユーザーもあれば、UTF-16でアップロードするユーザーもいます。アップロードされたファイルがUTF-8またはUTF-16であるかどうかを調べるにはどうすればよいですか?
ファイルをUTF-16で保存してアップロードすると、そのデータはガーベジです。このような状況にどう対処することができますか?
ストリーム内で高い割合の00
バイトを確認するなど、さまざまなヒューリスティックを使用できます。 (これらはUTF-8には存在しませんが、ASCII文字を含むUTF-16テキストでは一般的です)
これは互換性のないUTF-8とWindows-1252を区別できません8どちらも米国英語のWindowsシステムでよく使用されています。 1つのエンコーディングでは無効で、別のエンコーディングでは無効なバイトシーケンスを探すなど、より多くのチェックを追加できますが、これは非常に複雑になり始め、通常、異なるシングルバイトエンコーディングを区別しません。
マイクロソフトでは、MLangという名前のライブラリを提供しています。このライブラリは、ストリーム内のバイトの統計解析を使用して、UTF-8、UTF-16、および多くの8ビットコードページを自動的に検出します。それが働くテキストの十分なサンプルを持っているなら、その正確さはかなり良いです。私はblogged about how to use this method、投稿したfull source code on GitHub。
使用できるオプションはいくつかあります。コンテンツタイプに、エンコードを示す文字セットパラメータ(例:Content-Type: text/plain; charset=utf-16
)が含まれているかどうかを確認します。アップロードされたデータにBOM(UIC-16の場合はU + FEFF - UTF-16の場合は2バイト、UTF-8の場合は3)にマッピングされるファイルの最初の数バイトがあるかどうか、 (ASCIIのような、最初の文字はXMLのように '<'で始まります)、それを使ってエンコーディングを見つけることができます。しかし、これらの情報がない場合は、ヒューリスティックを使用して推測する必要があります。
バイトオーダーマークは 'U + FEFF'(UTF-16BEでは' FF FE'、UTF-16BEでは 'FE FF')です。 'U + FFFE'はUnicodeの文字ではありません。 –
ありがとう、修正インライン – carlosfigueira
もっと良い選択肢はutf-8でアップロードするように伝えるだけです。 – Shawn
@Shawnあなたはそうかもしれませんが、私は "UTF-8でのアップロード"はほとんどの非技術的ユーザーには理解できず、技術的ユーザーには不満があると思います。 –