Snp*_*nps 1 java linux character-encoding apache-commons
我正在实现一个像这样工作的软件:
我有一台运行vt100终端应用程序的Linux服务器输出文本.我的程序telnet服务器并读取/解析文本的位到相关数据.相关数据被发送到由Web服务器运行的小客户端,该Web服务器在HTML页面上输出数据.
我的问题是某些特殊字符如"åäö"被输出为问号(经典).
背景:
我的程序使用Apache Commons TelnetClient读取字节流.字节流被转换为字符串,然后相关的位被子字符串,并返回到分隔符字符.在此之后,新字符串将转换回字节数组,并使用Socket发送到Web服务器运行的客户端.此客户端根据接收的字节创建一个字符串,并将其打印在标准输出上,Web服务器从中读取并输出HTML.
第1步:byte [] - > String - > byte [] - > [发送到客户端]
Step2:byte [] - > String - > [print output]
问题:
当我在Windows上运行我的Java程序时,所有字符(包括"åäö")都会在生成的HTML页面上正确输出.但是,如果我在Linux上运行程序,所有特殊字符都会转换为" ? "(问号).
Web服务器和客户端当前正在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();
Run Code Online (Sandbox Code Playgroud)
由webserver运行的客户端:
Socket socket = new Socket(...);
byte[] data = readData(socket); // Assume this reads the bytes correctly.
String output = new String(data);
System.out.println(output);
Run Code Online (Sandbox Code Playgroud)
假设读写之间的同步有效.
思考:
我尝试过不同的编码和解码字节数组的方法,没有结果.我对charset编码问题有点新意,并希望得到一些指示.Windows"WINDOWS 1252"中的默认字符集似乎让特殊字符通过服务器一直到webserver,但是在Linux计算机上运行时默认字符集是不同的.我试图运行"Charset.defaultCharset().forName()",它表明我的Linux计算机设置为"US-ASCII".我认为Linux默认为"UTF-8"?
我该如何让我的程序在Linux上运行?
依赖平台默认编码通常是一个坏主意,特别是对于网络通信协议.
这两个new String()和String.getBytes()重载允许你指定的编码.由于您控制编码和解码,只需使用UTF-8(硬编码).
同时检查你的代码的用途FileInputStream,FileOutputStream,InputStreamReader并且OutputStreamWriter,所有这些ptentially依赖于平台的默认编码(前两个,独家,这使得它们很没用).