我的问题设置如下:
在包括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()来获取byte [],但结果是一样的。
当我使用FileItem.getString()时,它与代码页1252完美配合:正确读取欧元符号。当我在Eclipse中将它打印到控制台时,我看到了它。 但是对于代码页850,许多特殊字符都是错误的。
所以我的想法是使用FileItem.getString(String encoding)。但是我试图告诉他使用代码页1252的所有字符串都没有产生例外情况,但产生了错误的结果。
e.g。 getString(Charset.forName(“CP1252”)。name())导致问号而不是欧元符号。
使用org.apache.commons.fileupload.FileItem时,如何指定编码?
或者这是错误的方式?
提前感谢您的帮助!
答案 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。