私の問題の設定は次のとおりです。
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 を使用するときにエンコーディングを指定するにはどうすればよいですか?
それとも、これは間違った方法ですか?
事前にご協力いただきありがとうございます。