我的程序是一个基于socket的即时群聊系统
客户端和服务器socket都是用utf-8编码。客户端和服务器在同一台机器上测试的时候,完全正常。当分开时,客户端本来应该收到hello这个单词,现在却多收到了两个字符 \ufffd\ufffd
eclipse中编译时设置了utf-8.
这是服务端的流:
OutputStreamWriter stream = new OutputStreamWriter(
socket.getOutputStream(), "UTF8");
pw = new PrintWriter(stream);
br = new BufferedReader(new InputStreamReader(
socket.getInputStream(), "UTF8"));
这是客户端的流:
BufferedReader br = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream(), "UTF-8"));
OutputStreamWriter stream = new OutputStreamWriter(clientSocket.getOutputStream(), "UTF-8");
服务端发送的消息是:
pw.println("hello");
pw.flush();
客户端收到的是 \ufffd\ufffdhello
难道不同JRE传输数据会先传0xFFFE?
怀疑是这个问题,导致UTF-8无法解析,使用了替换符
请跟踪一下客户端,看看前两个字节是否为0xFFFE
编码是“UTF8”?……“-”呢?
"\ufffd\ufffd"通常出现在中文乱码中,这里只能建议楼主看看有没有这方面的因素,比如简/繁体中文啊,文件啊,中文GBK输入啊,等等。
检查一下两台机器是否用的是同一个语种。
[quote]我跟踪到了BufferedReader的fill()方法,发现InputStreamReader的in函数每次都会读到\ufffd,包括第一次读取“OK”,继续跟踪到StreamDecoder中的read方法,然后就是编译过的代码了,看不了。所以没有看到oxFFFE。 [/quote]
你直接跟踪clientSocket.getInputStream()
从不要从reader里面看,直接从stream里面
话说,你不要用PrintWrite封装试试。
[quote]我发现每个语句后面都会多一个字符\ufffd,比如说
发送OK,收到 OK\r\n\ufffd
我换成GBK传输结果同样是这样,同样地,同一台机器没有问题。 [/quote]
……
这个到底是前面多字符,还是后面多字符?
是多1个还是几个?