理想的开发状态是我开始就是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(mysqlResult.getBytes("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(clientSocket.getOutputStream(),"gb2312"));

OK,至此,我的VC++客户端能够正确的显示中文字符了。

如果其中我理解的原理有偏差,还望各位朋友不吝赐教。

java tcp 乱码_Java和C++通过Socket通信中文乱码的解决相关推荐

  1. java读txt文件乱码_java读取txt文件时出现中文乱码怎么解决

    java读取txt文件时出现中文乱码怎么解决 发布时间:2020-06-25 15:27:31 来源:亿速云 阅读:105 作者:Leah java读取txt文件时出现中文乱码怎么解决?针对这个问题, ...

  2. java mysql插入数据乱码_java连接mysql插入数据出现中文乱码

    java连接了mysql数据库后,程序行向数据库中插入信息,代码如下: dbhelper boringdb = new dbhelper(); boringdb.connSQL(); String i ...

  3. java 配置文件乱码_java程序读取properties配置文件出现中文乱码

    这个问题有两种办法: 第一种办法:如楼上所说的那样也可以,就是native2ascii -reverse -encoding gb2312 user.properties ActionName_zh_ ...

  4. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  5. java中文乱码 寮犱笁_MySQL命令窗口中文乱码或插入中文数据失败

    在Windwos上使用命令窗口操作MySQL数据库时,如果命令窗口的字符编码与数据库不一致时,就会出现中文乱码的情况 比如查询会出现中文乱码,或者插入数据会出现错误"ERROR 1366 ( ...

  6. java tcp实现_JAVA 通过 Socket 实现 TCP 编程

    简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...

  7. java 通信 教程_Java实现简单的socket通信教程

    今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了. 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有pa ...

  8. java微信公众号中文乱码_java微信公众平台开发回复中文消息乱码解决方案

    如上图所示,中文乱码,解决方法: 1,找到公众管理平台服务器配置的url请求地址对应的类(java是一个普通的servlet类). 2,在doPost方法中加入以下代码: // 将请求.响应的编码均设 ...

  9. java excel 中文乱码_java中读取excel文件中字符串乱码问题解决方法

    以前的时候发现直接java读取一个excel文件输出里面的字符串会乱码,中文字符不会乱码,但是遇到英文的时候输出会乱码.这个问题太奇怪了. 我的表格名字为Shirley.xls. 我曾经直接读取exc ...

最新文章

  1. Linux网络服务-Web Service之【HTTP协议简介】(一)
  2. phpcms V9 相关阅读/相关文章
  3. LogViewer超大文本浏览工具
  4. pageadminCMS.Net Framework的安装教程
  5. Go标准库os/exec使用指南
  6. eclipse中将一个项目作为library导入另一个项目中
  7. 由MySql漏洞导致电脑被入侵(特征为新增加名为piress的帐户)
  8. [Linux] VIM 代码折叠
  9. SCDPM 2012R2之保护SQL SERVER
  10. 都说 VR 开发坑太多,结果华为云 5G Cloud VR 放了个大招儿!
  11. Goodfellow“死磕”NIPS:这名字涉及色情和仇日
  12. zookeeper学习02 使用
  13. fedora 16 x64 安装gnustep object-c开发环境
  14. Java游戏程序设计教程 4.5打砖块游戏
  15. java语言c语言表情包_c语言表情包 - c语言微信表情包 - c语言QQ表情包 - 发表情 fabiaoqing.com...
  16. 如何将mac里的照片拷到硬盘
  17. 养老---任重而道远
  18. 视频分类之 UCF-101 上的 CNN 方法详解
  19. 如何解决企业税务压力?这些企业税收优惠政策您要了解
  20. 洛谷刷题C语言:距离函数、闰年展示、计算阶乘、猴子吃桃、培训

热门文章

  1. vue生命周期与vue请求
  2. 水果酒技术-山楂酒怎么做,山楂酒有几种制作方法
  3. dingding告警
  4. 【教程】github学生包,可免费使用copilot
  5. 20145204张亚军——web安全基础实践
  6. 千锋逆战班,css注册案例
  7. visio图形大小参数驱动
  8. 基于大数据的保险商业模式
  9. 中文puppy linux7.5,Puppy Linux 7.5发布,支持UEFI启动的
  10. ElasticSearch + Logstash + kibana