weixin_42467468
weixin_42467468
2011-06-15 14:14

socket通信中多收到了字符 \ufffd

已采纳

我的程序是一个基于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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

7条回答

  • weixin_42560972 也许世界还没停 10年前

    难道不同JRE传输数据会先传0xFFFE?
    怀疑是这个问题,导致UTF-8无法解析,使用了替换符

    请跟踪一下客户端,看看前两个字节是否为0xFFFE

    点赞 评论 复制链接分享
  • weixin_42560972 也许世界还没停 10年前

    [quote]我发现每个语句后面都会多一个字符\ufffd,比如说
    发送OK,收到 OK\r\n\ufffd
    我换成GBK传输结果同样是这样,同样地,同一台机器没有问题。 [/quote]
    ……
    这个到底是前面多字符,还是后面多字符?
    是多1个还是几个?

    点赞 评论 复制链接分享
  • fmjsjx fmjsjx 10年前

    话说,你不要用PrintWrite封装试试。

    点赞 评论 复制链接分享
  • weixin_42560972 也许世界还没停 10年前

    [quote]我跟踪到了BufferedReader的fill()方法,发现InputStreamReader的in函数每次都会读到\ufffd,包括第一次读取“OK”,继续跟踪到StreamDecoder中的read方法,然后就是编译过的代码了,看不了。所以没有看到oxFFFE。 [/quote]
    你直接跟踪clientSocket.getInputStream()
    从不要从reader里面看,直接从stream里面

    点赞 评论 复制链接分享
  • liuyiqi2008 liuyiqi2008 10年前

    检查一下两台机器是否用的是同一个语种。

    点赞 评论 复制链接分享
  • fmjsjx fmjsjx 10年前

    "\ufffd\ufffd"通常出现在中文乱码中,这里只能建议楼主看看有没有这方面的因素,比如简/繁体中文啊,文件啊,中文GBK输入啊,等等。

    点赞 评论 复制链接分享
  • fmjsjx fmjsjx 10年前

    编码是“UTF8”?……“-”呢?

    点赞 评论 复制链接分享

相关推荐