基于socket编程的客户端服务器回射函数的关于汉字乱码的解释

                                                   汉字所占的字节数

          在编写客户端服务器回射函数的,当客户端向服务器连续发送信息时,发送给服务器和回射给客户端的内容会因为发送内容的长短和是汉字或字符串而出现乱码。在对其进行 研究后,写出解释。

预备知识:

    存储汉字应该用字符数组,这一点是肯定的,关键问题是汉字在你的计算机系统上占几个字节。多数人会认为一个汉字肯定占两个字节,其实不然。汉字到底占几个字节,这是随系统不同而不同的,而且还依赖于软件环境,如Visual Basic中汉字占一个字节。可以在你的计算机上用strlen()函数测试一下,如:

       printf("%d",strlen("计算机"));

  若输出为6,则每个汉字占两个字节;若输出9,则每个汉字占三个字节;若输出12,则每个汉字占四个字节。大多数系统是每个汉字占两个字节的,即上述语句输出值为6。应当注意的是一个全角字符(包括标点符号)同汉字占据相同的字节。

  这样你就可以用字符数组存储汉字了,但别忘了,由于C语言中字符串是以'\0'作为结束标记的,系统会自动加上这个标记符,而用strlen()函数测试的返回值不包括这个'\0'因此在定义和初始化字符数组时应当使数组长度最小为实际字符串长再加1。

      前提:已知一个汉字在该环境下占用3个字节(可以在函数中加入printf("‘计算机’三个字所占的字节数为:%d",strlen(”计算机“))来求得);

   

显示乱码情况如下:


    解释:在发送第一个‘我爱你’后,占用了9个字节空间,然后在发‘心情’,占用了前六个空间,即覆盖了‘我爱’两个字,理论上能显示最后一个‘你’。但我们要知道字符是以‘\0’作为结束符的,系统会自动加上这个标记符。所以该结束符会占用‘你’这个字的第一个字节,另外两个字节就只能显示为两个乱码。下面乱码的情况一次类推。



解决方法:

  在对代码进行分析后,发现出现乱码的原因是用来存储字符的数组在每次存储上一次发送或接收的字符后没有将对应的内容清空,导致下一次写内容时覆盖不完全而出现乱码。解决方法就是在将数组中的内容写到对对应的socket中后,将其内容赋值为空。语句为:客户端:memset(sendline,0,sizeof(sendline));   memset(recvline,0,sizeof(recvline))。服务器端:memset(recvline,0,sizeof(recvline));

配截图如下:对比上图,不再出先乱码。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值