2

我有一个 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">

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

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

谢谢,

奥特曼·马利赫

4

1 回答 1

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 上做同样的事情。如果您只是打开文件,编辑器将采用平台编码(UTF-8在现代 Linux 系统上)并尝试使用该编码读取文件 -> ISO-8859-1umlauts 将是乱码。但是如果你用 来打开文件ISO-8859-1,那么UTF-8就会出现乱码。这是确定文本文件真正编码的唯一方法。

于 2012-09-14T14:08:53.563 回答