|
 
- 帖子
- 173
- 主题
- 2
- 精华
- 0
- 积分
- 359
- 疯狂金币
- 115
- 疯狂水晶
- 0
- 在线时间
- 156 小时
|
4#
发表于 2010-3-18 20:54
| 只看该作者
下午终于调通分享下(对方使用C#服务端接收文本消息):
在java里面new String("消息".getBytes("GBK"),"UTF-8");
这种方式无论怎么转换都是在JVM内部转换,那么凡是牵涉流的地方比如数据库、文件等就涉及到JVM内部编码(unicode)和外部os的编码之间转换,java里面的InputStreamReader和OutputStreamWriter不仅提供了字节流和字符流之间的转换同时提供了编码的转换!!
所以当用new String("消息".getBytes("GBK"),"UTF-8");进行转换的时候只是在JVM内部转换,那么一旦将数据发送到jvm外部,必然就涉及到了编码的转换,那么使用传统的发送方式
PrintWriter pw = new PrintWriter(socket.getOutputStream);实际上发送前又进行了一次转换,使用了操作系统的默认编码System.getProperty("file.encoding");我这里显示是GBK所以对方是UTF-8收到必然是乱码。正解如下传输:
字符流方式发送
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream),"UTF-8")),false);
字节流方式发送
PrintStream ps = new PrintStream(socket.getOutputStream(),false,"UTF-8");
其实道理很简单,但是受网页开发影响以为new String("消息".getBytes("GBK"),"UTF-8");
就可以解决任何编码问题,false表示手动使用pw.flush(); |
-
1
评分人数
-
|