理想的开发状态是我开始就是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++客户端能够正确的显示中文字符了。

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

Java和C++通过Socket通信中文乱码的解决的更多相关文章

  1. 关于java代码提交HTTP POST请求中文乱码的解决方法

    首先说明下这些只是根据我工作常用经验的总结,可能不一定完全对,也不一定全面,但却是最通用的. JAVA里HTTP提交方式 httpurlconnection:jdk里自带的 httpclient:ap ...

  2. java socket输入输出中文乱码问题

    http://hi.baidu.com/linjk03/item/e2028bfd990c14ea1a111feb 统一了输入输出的编码格式,是不会有乱码问题出现的.   构造Reader或Write ...

  3. java和C#之间SOCKET通信的问题

    转自:http://www.cdtarena.com/javapx/201307/9170.html java和C#之间SOCKET通信的问题 一.服务器端(使用java编写) /** * 监听客户端 ...

  4. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  5. Java和C#的socket通信相关(转)

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  6. Java进阶(四十七)Socket通信

    Java进阶(四十七)Socket通信   今天讲解一个 Hello Word 级别的 Java Socket 通信的例子.具体通讯过程如下: 先启动Server端,进入一个死循环以便一直监听某端口是 ...

  7. Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...

  8. js url传值中文乱码完美解决(JAVA)

    js url传值中文乱码完美解决(JAVA) 首先在你的jsp页面这样更改: var url="你要传入的Action的位置&ipid="+ipid+"& ...

  9. JSP的学习(4)——中文乱码的解决

    本篇将以JSP页面中可能存在的中文乱码问题进行分析和解决. 中文乱码的问题一直是国人在编程过程中的一大头疼问题,这点上在JSP.Servlet或Tomcat上随处可见.比如我们在写一个Servlet时 ...

随机推荐

  1. 解决IP地址冲突

    1.重新启动路由器就可以. 要是网络上的每一个设备都被分配了动态IP地址,路由器重新启动.又一次分配IP地址给网络上的每一个设备后,这个问题就有望得到解决. 可是假设是在企业内就不可能随便的重新启动公 ...

  2. Android -- Camera源码简析,启动流程

    com.android.camera.Camera.java,主要的实现Activity,继承于ActivityBase. ActivityBase 在ActivityBase中执行流程: onCre ...

  3. 如何将DB2的数据库转换到mySQL中?

    经过几次尝试最终找到解决的办法,因为网上并没有详细说明,所以下面我将详细的步骤记录如下: 1. 大前提是你已经安装好DB2服务器和mySQL服务器,现在只是借用Navicat for MySQL这个软 ...

  4. GeSHi Documentation

    GeSHi Documentation Version 1.0.8.11 Authors: © 2004 - 2007 Nigel McNie © 2007 - 2012 Benny Baumann ...

  5. [Javascript] Understand Curry

    The act of currying can be described as taking a multivariate function and turning it into a series ...

  6. POJ 3368 Frequent values (基础RMQ)

    Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14742   Accepted: 5354 ...

  7. SQL Server 附加数据库提示5120错误

    怎么样是不是跟你的错误是一样的,心里是不是有点小激动? T_T 终于有办法了!!!! 第一步先关掉你的SQLserver 然后在菜单上找找到SQLSERVER右键选择“以管理员运行” 第二步给你的数据 ...

  8. PHP表单-PHP $_POST 变量

    PHP $_POST 变量 在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 预定义的 $_POST 变量用 ...

  9. php之快速入门学习-17(PHP 命名空间)

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  10. 在浏览器中使用JS打开并展示PDF文件

    使用jquery.media.js插件 示例: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=& ...