如何使用java上传文件而不更改其编码

时间:2012-09-14 13:57:19

标签: java java-ee servlets file-upload

我有一个Java类,它将文本文件从Windows客户端上传到Linux服务器。

我要上传的文件是使用Cp1252或ISO-8859-1编码的。

当文件上传时,使用utf-8编码,然后无法读取包含éèà等重音符号的字符串。

命令

file -i *
linux服务器中的

告诉我它是用utf-8编码的。

我认为编码在上传时已经改变了,所以我将这段代码添加到我的servlet中:

String currentEncoding=System.getProperty("file.encoding");
System.setProperty("file.encoding", "Cp1252");
item.write(file);
System.setProperty("file.encoding", currentEncoding);

在jsp文件中,我有这段代码:

<form name="formUpload"
action="..." method="post"
enctype="multipart/form-data" accept-charset="ISO-8859-1">

我用来上传文件的lib是apache commun。

Doe的任何人都有线索,因为我真的没有想法!

谢谢,

Otmane MALIH

1 个答案:

答案 0 :(得分:2)

设置系统属性file.encoding仅在启动Java时有效。相反,您必须使用以下代码打开文件:

public static BufferedWriter createWriter( File file, Charset charset ) throws IOException {
    FileOutputStream stream = new FileOutputStream( file );
    return new BufferedWriter( new OutputStreamWriter( stream, charset ) );
}

Charset.forName("iso8859-1")用作charset参数。

[编辑] 您的问题很可能是file命令。 MacOS是世界上唯一能够自信地告诉您文件编码的操作系统。 Windows和Linux必须猜测。这种猜测可能是错误的。

因此,您需要做的是使用编辑器打开文件,您可以在其中指定编码。您需要在Windows上执行此操作(以确保文件确实与Cp1252一起保存;某些应用程序忽略该平台并始终在UTF-8)中保护其数据。

你需要在Linux上做同样的事情。如果您只是打开文件,编辑器将采用平台编码(在现代Linux系统上为UTF-8)并尝试使用该文件读取文件 - &gt; ISO-8859-1变音符号会出现乱码。但是,如果您使用ISO-8859-1打开文件,则UTF-8将出现乱码。这是确定文本文件编码的唯一方法。