0

私の問題の設定は次のとおりです。

Web サービス通信を含むクライアント/サーバー アーキテクチャでは、サーバー側でクライアントから CSV ファイルを取得します。API は私に org.apache.commons.fileupload.FileItem を与えます

これらのファイルに許可されているコードページは、コードページ 850 とコードページ 1252 です。

すべて正常に動作しますが、唯一の問題はユーロ記号 (€) です。コードページ 1252 の場合、私のコードはユーロ記号を正しく処理できません。その代わりに、Unicode U+00A4: ¤ の記号が Eclipse のコンソールに表示されます。

現在、次のコードを使用しています。一部のクラスに分散しています。関連する行を抽出しました。

byte[] inputData = call.getImportDatei().get();

// the following method works correctly
// it returns Charset.forName("CP850") or Charset.forName("CP1252")
final Charset charset = retrieveCharset(inputData);

char[] stringContents;
final StringBuffer sb = new StringBuffer();

final String s = new String(inputData, charset.name());

// here I see the problem with the euro sign already
// the following code shouldn't be the problem

// here some special characters are converted, but this doesn't affect the problem, so I removed those lines
stringContents = s.toCharArray();
for(final char c : stringContents){
  sb.append(c);
}
final Reader stringReader = new StringReader(sb.toString());


// org.supercsv.io.CsvListReader
CsvListReader reader = new CsvListReader(stringReader, CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE);
// now this reader is used to read the CSV content...

私は別のものを試しました:

FileItem.getInputStream()

FileItem.getInputStream() を使用して byte[] を取得しましたが、結果は同じでした。

FileItem.getString()

FileItem.getString() を使用すると、コードページ 1252 で完全に動作します。ユーロ記号は正しく読み取られます。Eclipse のコンソールに出力すると表示されます。しかし、コード ページ 850 では、多くの特殊文字が間違っています。

FileItem.getString(文字列エンコーディング)

だから私の考えは FileItem.getString(String encoding) を使うことでした。しかし、コードページ 1252 を使用するように彼に伝えようとしたすべての文字列は例外を生成しませんでしたが、間違った結果が生成されました。

たとえば、getString(Charset.forName("CP1252").name()) は、ユーロ記号ではなく疑問符になります。

org.apache.commons.fileupload.FileItem を使用するときにエンコーディングを指定するにはどうすればよいですか?

それとも、これは間違った方法ですか?

事前にご協力いただきありがとうございます。

4

1 に答える 1

1

Eclipse のコンソールに出力すると表示されます。しかし、コード ページ 850 では、特殊文字が間違っている可能性があります。

Eclipse コンソールによって提示される結果に集中しすぎて、誤解を招いています。基礎となるデータは正しいですが、Eclipse はそれを間違って提示しました。Windows では、デフォルトで cp1252 を使用して によって出力される文字を表示するように設定されていSystem.out.println()ます。この方法では、最初に別の文字セットでデコードされた文字は明らかに正しく表示されません。

これらの文字を表示するには、UTF-8 を使用するように Eclipse コンソールを再構成することをお勧めします。UTF-8 は、世界が認識しているすべての文字をカバーしています。これを行うには、[ウィンドウ] > [設定] > [一般] > [ワークスペース] > [テキスト ファイルのエンコード] プロパティを UTF-8 に設定します。

次に、明らかにApache Commons FileUploadFileItemから使用していることを考えると、次のように、はるかに簡単な方法で適切にエンコードされたコンテンツを取得できます。FileItemReader

byte[] content = fileItem.get();
Charset charset = retrieveCharset(content); // No idea what you're doing there, but kudos that it's returning the right charset.
Reader reader = new InputStreamReader(new ByteArrayInputStream(content), charset);
// ...

後でこの CSV を 以外の文字ベースの出力ストリームSystem.out.println()( など)に書き込む場合FileWriterは、文字セットを UTF-8 に設定することも明示的に指定することを忘れないでください。でそれを行うことができますOutputStreamWriter。それ以外の場合は、プラットフォームの既定のエンコーディング (Windows では cp1252) が引き続き使用されます。

以下も参照してください。

于 2013-07-24T15:29:02.900 に答える