Java - SCP之后的“ü/ä/ö”问题

时间:2016-09-28 08:56:51

标签: java jsch

我创建了一个可以加载本地或远程日志文件的Programm。 如果我加载本地文件没有错误。 但是,如果我首先将带有SCP的文件复制到我的本地(我使用此代码:http://www.jcraft.com/jsch/examples/ScpFrom.java.html)并读出来我得到一个错误,字母“ü/ä/ö”显示为 。 我该如何解决这个问题?

远程:Linux-Server 本地:Windows-PC

SCP代码:

  

http://www.jcraft.com/jsch/examples/ScpFrom.java.html

阅读代码:

protected void openTempRemoteFile() throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream( lfile )));
        String strLine;

        DefaultTableModel dtm = new DefaultTableModel(0, 0);
        String header[] = new String[]{ "Timestamp", "Session-ID", "Log" };
        dtm.setColumnIdentifiers(header);
        table.setModel(dtm);

        while ((strLine = reader.readLine()) != null) {     

            String[] sparts = strLine.split(" ");
            String[] bparts = strLine.split("   : ");

            String Timestamp = sparts[0] + " " + sparts[1];
            String SessionID = sparts[4];
            String Log = bparts[1];

            dtm.addRow(new Object[] {Timestamp, SessionID, Log});
        }
        reader.close();
}

编辑:

本地文件的编码格式:UTF-8

从Linux-Server编码SCP-Remote-Files的格式:WINDOWS-1252

3 个答案:

答案 0 :(得分:3)

要解决您的问题,您至少有两个选择:

您可以直接在代码中指定文件的编码,更新如下:

BufferedReader reader = new BufferedReader(
    new InputStreamReader(
        new FileInputStream( lfile ),
        "UTF8"
    )
);

或使用以下命令设置启动JVM时的默认文件编码:

java -Dfile.encoding=UTF-8 … com.example.Main

我绝对更喜欢第一种方式,如果需要,您也可以参数化“UTF8”值。 使用后一种方法,如果您忘记指定它,您仍然可能面临同样的问题。

您可以使用您喜欢的任何内容替换编码(有关支持的编码,请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html),在Windows上,“Cp1252”通常是默认编码。

请记住,您始终可以使用查询file.encoding属性或Charset.defaultCharset()来查找应用程序的当前默认编码,例如:

byte [] byteArray = {'blablabla'};
InputStream inputStream = new ByteArrayInputStream(byteArray);
InputStreamReader reader = new InputStreamReader(inputStream);
String defaultEncoding = reader.getEncoding();

答案 1 :(得分:2)

Charset构造函数提供适当的InputStreamReader,例如:

import java.nio.charset.StandardCharsets;

...

BufferedReader reader = new BufferedReader(
    new InputStreamReader(
        new FileInputStream( lfile ),
        StandardCharsets.UTF_8)); // try also ISO_8859_1 if UTF_8 doesn't help.

答案 2 :(得分:2)

使用编码是非常棘手的事情。如果您的系统总是使用这种文件(来自不同的环境),那么首先应该检测字符集,而不是使用给定的字符集来读取它。我有类似的问题,我用过 juniversalchardet 检测字符集并使用InputStreamReader(stream, Charset)。 在你的情况下,它就像

protected void openTempRemoteFile() throws IOException {
        String encoding = UniversalDetector.detectCharset(lfile);
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream( lfile ), Charset.forName(encoding)));
        ....

如果只是一次性工作,而不是在文本编辑器中打开它(例如notapad ++),而不是将其保存在编码中。比在程序中使用它。