从包含代码页1252的FileItem读取包含欧元符号的内容

时间:2013-07-24 14:10:16

标签: java character-encoding io apache-commons-fileupload

我的问题设置如下:

在包括Web服务通信的客户端/服务器体系结构中,我从服务器端获取来自客户端的CSV文件。 API给了我一个org.apache.commons.fileupload.FileItem

这些文件的允许代码页是代码页850和代码页1252。

一切正常,唯一的问题是欧元符号(€)。在代码页1252的情况下,我的代码无法正确处理欧元符号。而不是它,当我在Eclipse中将它打印到控制台时,我看到带有unicode U + 00A4的符号:¤。

目前我使用以下代码。它分布在一些课程上。我已经提取了相关的行。

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(String encoding)

所以我的想法是使用FileItem.getString(String encoding)。但是我试图告诉他使用代码页1252的所有字符串都没有产生例外情况,但产生了错误的结果。

e.g。 getString(Charset.forName(“CP1252”)。name())导致问号而不是欧元符号。

使用org.apache.commons.fileupload.FileItem时,如何指定编码?

或者这是错误的方式?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

我在Eclipse中将其打印到控制台时看到了它。但是使用代码页850可能会出现特殊字符错误。

你过分关注Eclipse控制台提供的结果会被误导。底层数据是正确的,但Eclipse错误地提出了它。在Windows上,默认配置为使用cp1252显示由System.out.println()打印的字符。这样,最初使用不同字符集解码的字符显然不会正确显示。

您最好重新配置Eclipse控制台以使用UTF-8来呈现这些字符。 UTF-8涵盖了全世界都知道的每一个角色。你可以通过设置 Window>来做到这一点。偏好>一般>工作区>文本文件编码支持UTF-8。

然后,鉴于您显然正在使用Apache Commons FileUpload中的FileItem,您可以通过以下更简单的方式获取FileItem内容作为正确编码的Reader

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。

另见: