2023年8月3日发(作者:)
javasocketutf-8_Java和C++通过Socket通信中⽂乱码的解决理想的开发状态是我开始就是C开发,⼀直是C的开发,现在还是C的开发,若⼲年后,幸运的话,我可以成为C语⾔的⾼⼿或者专家……更实际的情况是我开始是C开发,后来变成了JAVA开发,然后⼜做起了VC++的开发,⼏年下来,发现⾃⼰⼏乎⼀⽆所长,成为了编程界的万⾦油,这种产物很重要,但是也⽐较尴尬。前⼀段时间我⽤C开发了⼀个服务器程序,前端是VC开发的客户端。现在我⽤JAVA开发了⼀个类似的服务器程序,前端依然是VC开发的客户端,运⾏时发现,中⽂乱码了。先说说我的问题场景,很常见:1 VC++客户端请求Java服务器,Java服务器从mysql数据库⾥读取中⽂字符串,然后通过Socket发送给客户端。我以前也遇到编码的问题,⽤GBK,GB2312,UTF-8⼀顿乱转,竟然解决了。这次我如法炮制,各种转,都失败了。再次感谢互联⽹,在⽹上查了不少的资料,看到了不少的说法,尝试了好多都没有成功。即便如此,还是有不少的启发,沉下来⾃⼰去分析⾃⼰的代码,最终幸运的解决了,现在梳理⼀下⾃⼰的思路,希望也许某⼀天能帮到正在抓⽿挠腮的你。①数据库编码我的mysql数据库的编码是默认的latin1,打开数据库,发现存储的中⽂字符串是乱码。这说明我存的不是latin1编码,那是什么呢?②数据库插⼊数据库中的数据是通过WEB软件插⼊的,查看得知插⼊的中⽂字符编码是gb2312。③数据库访问再看⼀下数据库的编码情况,在数据库中执⾏命令如下:1 mysql> show variables like '%char%';2 +--------------------------+----------------------------+3 | Variable_name | Value |4 +--------------------------+----------------------------+5 | character_set_client | latin1 |6 | character_set_connection | latin1 |7 | character_set_database | latin1 |8 | character_set_filesystem | binary |9 | character_set_results | latin1 |10 | character_set_server | latin1 |11 | character_set_system | utf8 |12 | character_sets_dir | /usr/share/mysql/charsets/ |13 +--------------------------+----------------------------+我们需要重点关注的是以下⼏个配置:| character_set_client | latin1 | 客户端的字符集| character_set_connection | latin1 | 连接字符集| character_set_results | latin1 | 结果字符集可以在访问数据库时,通过发送语句【set names gb2312】设置需要的编码格式。我没有在访问数据库时⼿动的设置编码,所以得到的结果集应该是latin1编码。④编码转换按照以上的步骤分析,就是现在我的Java程序得到的是latin1编码的字符串,我需要正确的把它编码为原始的gb2312。感谢Java的便捷,⼀句话就完成了两次编码转换:1 String encodeStr = new String(es("iso-8859-1"),"gb2312") //latin1编码在Java中的编码标识为"iso-8859-1"。此时在程序中经过打印论证了编码的正确性,能够得到WEB页⾯实际输⼊的中⽂字符串。⑤Socket发送然后我信⼼满满的将这个转换后的结果通过BufferedWriter发送给VC++客户端。结果,竟然还是乱码这是为什么呢再次的查找资料,得到了结论:Java通过Socket发送的字符流默认编码格式为utf-8,⽽VC++的Socket默认的字符接收编码⽅式为gb2312。只需要修改Java端的Socket发送编码即可:1 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(putStream(),"gb2312"));OK,⾄此,我的VC++客户端能够正确的显⽰中⽂字符了。如果其中我理解的原理有偏差,还望各位朋友不吝赐教。
2023年8月3日发(作者:)
javasocketutf-8_Java和C++通过Socket通信中⽂乱码的解决理想的开发状态是我开始就是C开发,⼀直是C的开发,现在还是C的开发,若⼲年后,幸运的话,我可以成为C语⾔的⾼⼿或者专家……更实际的情况是我开始是C开发,后来变成了JAVA开发,然后⼜做起了VC++的开发,⼏年下来,发现⾃⼰⼏乎⼀⽆所长,成为了编程界的万⾦油,这种产物很重要,但是也⽐较尴尬。前⼀段时间我⽤C开发了⼀个服务器程序,前端是VC开发的客户端。现在我⽤JAVA开发了⼀个类似的服务器程序,前端依然是VC开发的客户端,运⾏时发现,中⽂乱码了。先说说我的问题场景,很常见:1 VC++客户端请求Java服务器,Java服务器从mysql数据库⾥读取中⽂字符串,然后通过Socket发送给客户端。我以前也遇到编码的问题,⽤GBK,GB2312,UTF-8⼀顿乱转,竟然解决了。这次我如法炮制,各种转,都失败了。再次感谢互联⽹,在⽹上查了不少的资料,看到了不少的说法,尝试了好多都没有成功。即便如此,还是有不少的启发,沉下来⾃⼰去分析⾃⼰的代码,最终幸运的解决了,现在梳理⼀下⾃⼰的思路,希望也许某⼀天能帮到正在抓⽿挠腮的你。①数据库编码我的mysql数据库的编码是默认的latin1,打开数据库,发现存储的中⽂字符串是乱码。这说明我存的不是latin1编码,那是什么呢?②数据库插⼊数据库中的数据是通过WEB软件插⼊的,查看得知插⼊的中⽂字符编码是gb2312。③数据库访问再看⼀下数据库的编码情况,在数据库中执⾏命令如下:1 mysql> show variables like '%char%';2 +--------------------------+----------------------------+3 | Variable_name | Value |4 +--------------------------+----------------------------+5 | character_set_client | latin1 |6 | character_set_connection | latin1 |7 | character_set_database | latin1 |8 | character_set_filesystem | binary |9 | character_set_results | latin1 |10 | character_set_server | latin1 |11 | character_set_system | utf8 |12 | character_sets_dir | /usr/share/mysql/charsets/ |13 +--------------------------+----------------------------+我们需要重点关注的是以下⼏个配置:| character_set_client | latin1 | 客户端的字符集| character_set_connection | latin1 | 连接字符集| character_set_results | latin1 | 结果字符集可以在访问数据库时,通过发送语句【set names gb2312】设置需要的编码格式。我没有在访问数据库时⼿动的设置编码,所以得到的结果集应该是latin1编码。④编码转换按照以上的步骤分析,就是现在我的Java程序得到的是latin1编码的字符串,我需要正确的把它编码为原始的gb2312。感谢Java的便捷,⼀句话就完成了两次编码转换:1 String encodeStr = new String(es("iso-8859-1"),"gb2312") //latin1编码在Java中的编码标识为"iso-8859-1"。此时在程序中经过打印论证了编码的正确性,能够得到WEB页⾯实际输⼊的中⽂字符串。⑤Socket发送然后我信⼼满满的将这个转换后的结果通过BufferedWriter发送给VC++客户端。结果,竟然还是乱码这是为什么呢再次的查找资料,得到了结论:Java通过Socket发送的字符流默认编码格式为utf-8,⽽VC++的Socket默认的字符接收编码⽅式为gb2312。只需要修改Java端的Socket发送编码即可:1 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(putStream(),"gb2312"));OK,⾄此,我的VC++客户端能够正确的显⽰中⽂字符了。如果其中我理解的原理有偏差,还望各位朋友不吝赐教。
发布评论