问题源于某公司的一道机试题,要求是写一个网络聊天室,客户端用telnet连接到服务器。
实现接近尾声的时候,突然发现从控制台输入的中文是乱码。我的代码如下:
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
while(true) {
try {
cinString = br.readLine();
client.execute(cinString);
if(cinString.equals("/quit")){
client.close();
return;
}
}
catch(IOException e) {
e.printStackTrace();
}
}
经过排查,程序应该是不存在问题的。因为唯一一处涉及编码问题的操作,是在将System.in
封装到InputStreamReader
内部时,解码需要设置CharSet。但是默认是使用Charset.defaultCharset()
,这个就是真实平台下控制台的,所以应该是不需要自己考虑的。
果然,将项目到处jar包,在windows cmd下运行,是不存在乱码的。
但是还有一个问题,客户端的平台编码多种多样,服务器怎么确认呢?一种方法是传输数据的时候指明编码,就像http协议一样。但是我为了保证机试服务器的通用性(像putty一种类的软件可以直接使用),所以没有定义任何的协议规范,自然不好传输编码格式。好在还有另外一种解决方案。
将客户端和服务器的编码格式统一为UTF8
,这样每次直接传输统一编码格式编码后的字节数组,而不是往一个Write流里写入字符串。