理想的开发状态是我开始就是C开发,一直是C的开发,现在还是C的开发,若干年后,幸运的话,我可以成为C语言的高手或者专家……

更实际的情况是我开始是C开发,后来变成了JAVA开发,然后又做起了VC++的开发,几年下来,发现自己几乎一无所长,成为了编程界的万金油,这种产物很重要,但是也比较尴尬。

前一段时间我用C开发了一个服务器程序,前端是VC开发的客户端。

现在我用JAVA开发了一个类似的服务器程序,前端依然是VC开发的客户端,运行时发现,中文乱码了。

先说说我的问题场景,很常见:

 VC++客户端请求Java服务器,Java服务器从mysql数据库里读取中文字符串,然后通过Socket发送给客户端。

我以前也遇到编码的问题,用GBK,GB2312,UTF-8一顿乱转,竟然解决了。这次我如法炮制,各种转,都失败了。

再次感谢互联网,在网上查了不少的资料,看到了不少的说法,尝试了好多都没有成功。

即便如此,还是有不少的启发,沉下来自己去分析自己的代码,最终幸运的解决了,现在梳理一下自己的思路,希望也许某一天能帮到正在抓耳挠腮的你。

①数据库编码

我的mysql数据库的编码是默认的latin1,打开数据库,发现存储的中文字符串是乱码。这说明我存的不是latin1编码,那是什么呢?

②数据库插入

数据库中的数据是通过WEB软件插入的,查看得知插入的中文字符编码是gb2312。

③数据库访问

再看一下数据库的编码情况,在数据库中执行命令如下:

 mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

我们需要重点关注的是以下几个配置:

| character_set_client | latin1 |    客户端的字符集

| character_set_connection | latin1 |    连接字符集

| character_set_results | latin1 |    结果字符集

可以在访问数据库时,通过发送语句【set names gb2312】设置需要的编码格式。

我没有在访问数据库时手动的设置编码,所以得到的结果集应该是latin1编码。

④编码转换

按照以上的步骤分析,就是现在我的Java程序得到的是latin1编码的字符串,我需要正确的把它编码为原始的gb2312。

感谢Java的便捷,一句话就完成了两次编码转换:

 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发送编码即可:

 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream(),"gb2312"));

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

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

最新文章

  1. 关于Java泛型的使用
  2. hybird之web动态换肤实现
  3. 【BZOJ 1031】【JSOI 2007】字符加密Cipher
  4. 安装Maven、Eclipse设置、添加地址JAR
  5. 警惕SQL语句陷井
  6. iOS学习笔记---C语言第四天
  7. markdownpad2 pro注册信息升级 破解版
  8. linux服务器上apache+php独立于mysql server单独部署
  9. Wpf配置文件属性
  10. Inna and Binary Logic
  11. 比较全面的gdb调试命令 (转载)
  12. Linux报too many open files的解决方案
  13. 吐槽net下没有靠谱的FastDFS的sdk之使用thrift实现JAVA和C#互通
  14. Oracle12c中PL/SQL(DBMS_SQL)新特性之隐式语句结果(DBMS_SQL.RETURN_RESULT and DBMS_SQL.GET_NEXT_RESULT)
  15. 十七、Hadoop学记笔记————Hbase入门
  16. 基于IIS的WCF
  17. SQL修改表字段,加附属属性
  18. C++对象模型复习
  19. 探索未知种族之osg类生物---状态树与渲染树以及节点树之间的关系
  20. Task Parallel Library02,更进一步

热门文章

  1. Android实现随机验证码——自定义View
  2. 网络结构设计——负载均衡之LVS学习笔记(二)
  3. Kettle中调用用户自定义的jar包
  4. 在Java程序中做字符串拼接时一定要记得的MessageFormat.format
  5. Silverlight 之 浅析
  6. c#实现验证码功能(多种模式下分别实现验证功能)详细,带注释
  7. UISlider设置按钮透明
  8. RESTful到底是什么玩意??
  9. ng-src 的坑
  10. js 动画性能分析 transfrom