2

(免責事項: 質問する前に、ここでいくつかの投稿を調べました。これは特に役に立ちました。可能であれば、皆さんからのちょっとした健全性チェックを探していました)

こんにちは、みんな、

データベースにロードするデータファイルを処理するために構築した内部 Java 製品 (別名 ETL ツール) があります。XSLT 変換用の事前ロールされたステージがあり、元のファイル内でパターンの置換などを行います。入力ファイルは任意の形式にすることができ、フラット データ ファイルまたは XML データ ファイルにすることができます。ロードされる特定のデータ フィードに必要なステージを構成します。

私はこれまで、ファイルのエンコーディングの問題を無視してきました (私が知っている間違いです)。ただし、ファイル エンコーディングの問題に直面しています。簡単に言うと、ステージを一緒に構成する方法の性質上、入力ファイルのファイル エンコーディングを検出し、Java Reader オブジェクトを作成する必要があります。適切な引数。完全に理解しているとは言えないことに飛び込む前に、皆さんと簡単な健全性チェックを行いたかっただけです。

  1. ツールキット内のすべてのステージから出力されるすべてのファイルに、UTF-16 の標準ファイル エンコーディングを採用します (将来的に 2 バイト文字を読み込む可能性を除外するつもりはありません)。
  2. JUniversalChardetまたはjchardetを使用して、入力ファイルのエンコーディングをスニッフィングします
  3. Apache Commons IO ライブラリを使用して、すべての段階で標準のリーダーとライターを作成します (これには同様のエンコーディング スニッフィング API がないと考えてよろしいですか?)

私の概説したアプローチで何か落とし穴が見えますか、または提供できる特別な知恵はありますか?

Java ランタイムに windows-1252 のエンコーディングを決定させるという既存のアプローチを使用してロードされたデータとの下位互換性を確信できる方法はありますか?

前もって感謝します、

-ジェームズ

4

2 に答える 2

2

フラットな文字データ ファイルでは、複数のエンコーディングで有効であるが別のエンコーディングにマップされるバイト シーケンスがあるため、エンコーディングの検出は統計とヒューリスティック ( BOMの存在、または文字/パターンの頻度など)に依存する必要があります。文字。

XMLエンコーディングの検出はより簡単なはずですが、あいまいにエンコードされた XML を作成することは確かに可能です (たとえば、ヘッダーのエンコーディングを除外することによって)。

意思決定者としてエンコーディング検出 API に依存するよりも、エラーの可能性をユーザーに示すためにエンコーディング検出 API を使用する方が理にかなっている場合があります。

Java でデータをbytes からs に変換すると、エンコーディング Xから UTF-16(BE) にトランスコードされます。データベースに送信される内容は、データベース、その JDBC ドライバー、および列の構成方法によって異なります。これには、おそらく UTF-16 から別のものへのトランスコーディングが含まれます。データベースを変更しないと仮定すると、既存の文字データは安全なはずです。BLOB を解析する場合は、問題が発生する可能性があります。異なるエンコーディングで記​​述されたファイルを解析済みで、それらを別のエンコーディングとして扱った場合、破損はすでに発生しています。それを修正する特効薬はありません。データベースの文字セットを「ANSI」から Unicode に変更する必要がある場合、それは苦痛になる可能性があります。char

可能な限りUnicode を採用することをお勧めします。それは不可能かもしれませんが、エンコーディングを明確にすることができるファイル形式を優先します - XML (簡単にします) や JSON (UTF-8 を義務付けます) のようなものです。

于 2010-02-02T17:55:41.817 に答える
1

オプション1は、後方互換性を壊していると思いますが(確かに長期的には)、「正しい方法」(正しい方法のオプションは一般的に後方互換性を壊します)であり、UTF-8が良い選択であるかどうかについておそらく追加の考えがあります。

スニファが正しく識別および識別できることを確認するためにテストした限られた既知のエンコーディング セットがある場合、エンコーディングをスニッフィングすることは合理的だと思います。

ここでの別のオプションは、データがUTF-16標準に従って提供され、それに応じて動作することをコードに知らせる何らかの形式のメタデータ(ファイル命名規則)を使用することです。先に進む前に UTF-16 標準。

于 2010-02-02T17:01:21.737 に答える