首页 > 编程语言 >Java和C++通过Socket通信中文乱码的解决

Java和C++通过Socket通信中文乱码的解决

时间:2023-01-04 16:48:30浏览次数:32  
标签:编码 set Java Socket 数据库 character 乱码 latin1

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

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

标签:编码,set,Java,Socket,数据库,character,乱码,latin1
From: https://www.cnblogs.com/kn-zheng/p/17025287.html

相关文章

  • 利用javaswing+百度云图像识别接口做一个简单的动植物图像识别
    importcom.baidu.aip.imageclassify.AipImageClassify;importcom.sun.prism.PresentableState;importorg.json.JSONObject;importjava.awt.*;importjava.awt.ev......
  • JAVA学习(一)~~~JAVA概念
    Java概念一、Java三大版本JavaSE(J2SE)java语言的核心,多用于开发桌面程序,控制台程序JavaEE(J2EE)企业级开发,架构在J2SE基础上,多用于开发web程序、服务器端Java......
  • java虚拟机能并发的启动多少个线程
    新建一个类,导入如下的测试代码:1publicclassTestNativeOutOfMemoryError{2publicstaticvoidmain(String[]args){34for(inti=0;;i++......
  • 如何使用Burp Suite测试WebSocket
    BurpSuite具有测试WebSocket的能力,可以实时拦截和修改WebSocket消息。遗憾的是,Burp缺乏针对WebSockets的Repeater、Scanner或Intruder功能。但在新版BurpSuite中,增加了针对......
  • 如何使用Fiddler测试WebSocket
    一Fiddler本身可以捕获WebSocket流量,但是无法操纵WebSocket流量。1、启动fiddler,在主session列表中找到带ws图标的WebSocket请求。2、双击ws请求,Fiddler界面右边就会出......
  • Java获取音频文件(MP3)的播放时长
    最近的一个项目需要按照时间播放mp3文件,例如,播放10分钟的不同音乐。这就意味着我得事先知道mp3文件的播放时长,以决定播放几遍这个文件。方案一:Java的方式找第三方的库,真......
  • 又见JavaWeb的中文乱码
    简单翻了一下记录,我已经写了至少4篇关于编码和乱码的博客了,每次都觉得自己懂了。实际上,这次的遭遇证明了“真懂”是一种很难达到的境界,吾辈仍需努力!一、背景是这样子的:......
  • Java 中文字符串编码之GBK转UTF-8
    写过两篇关于编码的文章了,以为自己比较了解编码了呢?!结果今天又结结实实的上了一课。以前转来转去解决的问题终归还是简单的情形。即iso-8859-1转utf-8,或者iso-8859-1转gb......
  • Linux删除多个java进程的其中一个
    一、背景:Linux后台运行了多个Java程序,进程名都是java。执行pkilljava会一次性杀掉所有的java进程。二、解决思路:1先通过一定的检索条件,定位出指定的java进程23......
  • java LinkedHashMap学习
    一、LinkedHashMap概述LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap。LinkedHashMap是Map接口的哈希表......