java tcp 乱码_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(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通信中文乱码的解决相关推荐
- java读txt文件乱码_java读取txt文件时出现中文乱码怎么解决
java读取txt文件时出现中文乱码怎么解决 发布时间:2020-06-25 15:27:31 来源:亿速云 阅读:105 作者:Leah java读取txt文件时出现中文乱码怎么解决?针对这个问题, ...
- java mysql插入数据乱码_java连接mysql插入数据出现中文乱码
java连接了mysql数据库后,程序行向数据库中插入信息,代码如下: dbhelper boringdb = new dbhelper(); boringdb.connSQL(); String i ...
- java 配置文件乱码_java程序读取properties配置文件出现中文乱码
这个问题有两种办法: 第一种办法:如楼上所说的那样也可以,就是native2ascii -reverse -encoding gb2312 user.properties ActionName_zh_ ...
- 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互
基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...
- java中文乱码 寮犱笁_MySQL命令窗口中文乱码或插入中文数据失败
在Windwos上使用命令窗口操作MySQL数据库时,如果命令窗口的字符编码与数据库不一致时,就会出现中文乱码的情况 比如查询会出现中文乱码,或者插入数据会出现错误"ERROR 1366 ( ...
- java tcp实现_JAVA 通过 Socket 实现 TCP 编程
简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...
- java 通信 教程_Java实现简单的socket通信教程
今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了. 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有pa ...
- java微信公众号中文乱码_java微信公众平台开发回复中文消息乱码解决方案
如上图所示,中文乱码,解决方法: 1,找到公众管理平台服务器配置的url请求地址对应的类(java是一个普通的servlet类). 2,在doPost方法中加入以下代码: // 将请求.响应的编码均设 ...
- java excel 中文乱码_java中读取excel文件中字符串乱码问题解决方法
以前的时候发现直接java读取一个excel文件输出里面的字符串会乱码,中文字符不会乱码,但是遇到英文的时候输出会乱码.这个问题太奇怪了. 我的表格名字为Shirley.xls. 我曾经直接读取exc ...
最新文章
- Linux网络服务-Web Service之【HTTP协议简介】(一)
- phpcms V9 相关阅读/相关文章
- LogViewer超大文本浏览工具
- pageadminCMS.Net Framework的安装教程
- Go标准库os/exec使用指南
- eclipse中将一个项目作为library导入另一个项目中
- 由MySql漏洞导致电脑被入侵(特征为新增加名为piress的帐户)
- [Linux] VIM 代码折叠
- SCDPM 2012R2之保护SQL SERVER
- 都说 VR 开发坑太多,结果华为云 5G Cloud VR 放了个大招儿!
- Goodfellow“死磕”NIPS:这名字涉及色情和仇日
- zookeeper学习02 使用
- fedora 16 x64 安装gnustep object-c开发环境
- Java游戏程序设计教程 4.5打砖块游戏
- java语言c语言表情包_c语言表情包 - c语言微信表情包 - c语言QQ表情包 - 发表情 fabiaoqing.com...
- 如何将mac里的照片拷到硬盘
- 养老---任重而道远
- 视频分类之 UCF-101 上的 CNN 方法详解
- 如何解决企业税务压力?这些企业税收优惠政策您要了解
- 洛谷刷题C语言:距离函数、闰年展示、计算阶乘、猴子吃桃、培训