我有一个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
答案 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
将出现乱码。这是确定文本文件编码的唯一方法。