【发布时间】:2011-10-24 22:20:05
【问题描述】:
我正在实现一个这样工作的软件:
我有一个 Linux 服务器,它运行一个输出文本的 vt100 终端应用程序。 我的程序远程登录服务器并将文本的位读取/解析为相关数据。 相关数据被发送到由网络服务器运行的小型客户端,该客户端在 HTML 页面上输出数据。
我的问题是某些特殊字符(例如“åäö”)被输出为问号(经典)。
背景:
我的程序使用 Apache Commons TelnetClient 读取字节流。字节流被转换为字符串,然后相关位被子串化并与分隔符一起放回。在此之后,新字符串被转换回字节数组并使用 Socket 发送到由网络服务器运行的客户端。该客户端从接收到的字节创建一个字符串,并将其打印在标准输出上,网络服务器从中读取并输出 HTML。
第 1 步: byte[] --> String --> byte[] --> [发送给客户端]
第二步: byte[] --> String --> [打印输出]
问题:
当我在 Windows 上运行我的 Java 程序时,所有字符,包括“åäö”,都会在生成的 HTML 页面上正确输出。但是,如果我在 Linux 上运行该程序,所有特殊字符都会转换为“?”(问号)。
网络服务器和客户端当前正在 Windows 上运行(第 2 步)。
代码:
该程序基本上是这样工作的:
我的程序:
byte[] data = telnetClient.readData() // Assume method works and returns a byte[] array of text.
// I have my reasons to append the characters one at a time using a StringBuffer.
StringBuffer buf = new StringBuffer();
for (byte b : data) {
buf.append((char) (b & 0xFF));
}
String text = buf.toString();
// ...
// Relevant bits are substring'ed and put back into the String.
// ...
ServerSocket serverSocket = new ServerSocket(...);
Socket socket = serverSocket.accept();
serverSocket.close();
socket.getOutputStream.write(text.getBytes());
socket.getOutputStream.flush();
webserver运行的客户端:
Socket socket = new Socket(...);
byte[] data = readData(socket); // Assume this reads the bytes correctly.
String output = new String(data);
System.out.println(output);
假设读写之间的同步工作正常。
想法:
我尝试了不同的编码和解码字节数组的方法,但没有结果。我对字符集编码问题有点陌生,想得到一些指示。 Windows“WINDOWS 1252”中的默认字符集似乎让特殊字符一直通过服务器到网络服务器,但是在Linux计算机上运行时,默认字符集是不同的。我尝试运行“Charset.defaultCharset().forName()”,它显示我的 Linux 计算机设置为“US-ASCII”。我以为Linux默认是“UTF-8”?
我应该如何让我的程序在 Linux 上运行?
【问题讨论】:
标签: java linux character-encoding apache-commons