我创建了一个可以加载本地或远程日志文件的Programm。 如果我加载本地文件没有错误。 但是,如果我首先将带有SCP的文件复制到我的本地(我使用此代码:http://www.jcraft.com/jsch/examples/ScpFrom.java.html)并读出来我得到一个错误,字母“ü/ä/ö”显示为 。 我该如何解决这个问题?
远程:Linux-Server 本地:Windows-PC
SCP代码:
阅读代码:
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
答案 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 ++),而不是将其保存在编码中。比在程序中使用它。