返回列表 发帖

GBK如何转换成UTF-8?

比如:
String str = "消息"; //gbk或者gb2312编码
str = new String(str.getBytes("gbk"),"UTF-8");
System.out.println(str):
请问这样转对吗?

然后使用PrintWriter发送过去,对方只接收UTF-8编码,不做处理。
数据库是SqlServer2008字符排序是SQL_Latin1_General_CP1_CI_AS
但是对方库里记录却是乱码?请问这是为什么啊?

提问赏金:5金币
获奖名单 : 大块头(5金币)    

估计是因为你数据库编码的原因,Latin1显示GBK是有问题的,没用过sql server,但你可以试着把数据库编码改为与你传入的字符串一致,推荐都使用UTF-8,应该就不会有乱码的问题了。(注:没用过sql server,但对于许多数据库而言,修改字符集后,要重新建数据库才能对字符集起作用或者要找到数据库对应可配置的地方)
小弟写程序的时候,自从将所有可以设置编码的地方一律使用UTF-8,从来没有碰到过乱码的问题
1

评分人数

  • heyitang

TOP

自己的数据库是简体中文GBK的
对方的数据库是SQL_Latin1_General_CP1_CI_AS

我取出数据从GBK转换成UTF-8 然后使用字符流PrintWriter发送过去。但是对方却说是乱码?

TOP

下午终于调通分享下(对方使用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

评分人数

  • heyitang

TOP

返回列表