初步实现了Android与pc服务器的通信之后,又碰到了传说中令人头疼不已的中文乱码问题。既然出现了乱码,那么原因自然是协议不通了。
我们知道eclipse中默认的编码标准是GBK,而安卓程序开发所默认的布局文件编码标准则是utf-8,这样一来,我们双方通信的时候便难免出现乱码。要解决它,就要从二者转换方面着手。
     首先我们知道,从安卓手机界面上获得的文字,其编码字符集是utf-8,所以,当我们的java文件获得它时,它是以utf-8形式编译的。所以这里,在得到EditText中的文字之后,用输出流将其输出,而服务器端再用一个字符串接收从输入缓冲流中获得的一行字符。

  1. // 读取客户端信息
  2. while (true) {
  3. while (is.available() > 0) {
  4. // 转码之前
  5. String msg_client1 = brd.readLine();
  6. System.out.println("转码之前:" + msg_client1);
  7. // 转码
  8. String msg_client = new String(msg_client1.getBytes("gbk"),
  9. "utf-8");
  10. String enter = new String("\r\n".getBytes("utf-8"));
  11. // 转码之后打印出
  12. System.out.println("客户端:" + msg_client);
  13. String msg_server = msg_client1 + enter;
  14. os.write(msg_server.getBytes());
  15. os.flush();
  16. Thread.sleep(1000);
  17. }
  18. }

不用猜,这时由于服务器端的编码标准是GBK,读出来的字符串必然是乱码。于是在下面,我们将得到的字节数组用utf-8的格式编译。于是,期盼已久的汉字终于出来了。

但是有没有发现,当输入偶数个汉字时,得到了正确的结果,而输入奇数个时,最后一个字变成了“??”?
     这又是为什么?这里纠结了很久,于是去搜索字符集编码的标准,终于发现了原因。对于gbk这种编码而言,中文所对应的字节数是2byte;而在utf-8中,中文则是对应三个字节。于是在输入奇数个汉字时,最后一个字节在gbk中则无法编译。譬如说utf-8编码的3个字,编码是123|456|789 ,在传输到服务器中时,系统认为这9个字节是gbk编码,于是就变成了12|34|56|78|9。后面多出的一个字节不能够编译成汉字,此时常用“?”来代替。于是最后一个byte变成了“?”(ASCII码为63)。这时再将它转成utf-8时,则变成了123|456|78?。这个时候第三个字也不能正确地读取了,于是出现了上图的结果(两个问号)。
      现在,要怎样解决呢?在尝试过各种编码的转换,徘徊于各种各样的乱码之间依然无法解决的时候,突然想到,之前的读取方式是通过bufferedreader一行一行的读取的,这样一来得到的输入流在字符缓冲区的时候,已经破坏了最后一个字节。那么,如果直接得到字节数组而不破坏它,是不是能解决呢?在这里改了一下代码,直接用得到的字节数组构成一个String,然后……

  1. // 读取客户端信息
  2. while (true) {
  3. while (is.available() > 0) {
  4. byte[] bb = new byte[is.available()];
  5. is.read(bb);
  6. // 转码之前
  7. String msg_client1 = new String(bb);
  8. System.out.println("转码之前:" + msg_client1);
  9. // 转码
  10. String enter = new String("\r\n".getBytes("utf-8"));
  11. String msg_client = new String(bb, "utf-8");
  12. System.out.println("客户端:" + msg_client);
  13. //发送
  14. String msg_server = msg_client1 + enter;
  15. os.write(msg_server.getBytes());
  16. os.flush();
  17. Thread.sleep(1000);
  18. }


     可以看到,奇数个汉字也能读取啦!(耶!)虽然说这个小问题纠结了很久,但也让自己更了解了编码的奥义,收获还是很大的。
     最后,解释一下new String(str.getBytes( "dd "), "cc ")的方法。简单来说,这种方法的用处是,当你的字符串的实际编码是“CC”,而被系统当成“DD”时,用这行代码可以得到正确的编码。

关于Android与pc通信时中文乱码的分析和解决的更多相关文章

  1. php中文乱码问题分析及解决办法

    中文乱码问题产生的原因,主要就是字符编码设置问题:             首先,mysql数据库安装的时候字符编码要选择正确,最好选择utf-8比较保险.如果安装时没有设置正确,找到mysql的安装 ...

  2. Android Studio导出JavaDoc时中文乱码问题解决

    导出过程中,如果出现JavaDoc中文乱码的问题,可以在Other command line arguments栏目添加命令参数:-encoding UTF-8 -charset UTF-8(如果是G ...

  3. SpringMVC学习系列-后记 解决GET请求时中文乱码的问题

    SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...

  4. curl提交数据时中文乱码

    1.使用curl提交数据时中文乱码解决: <?php $testJSON=array('name'=>'中文字符串','value'=>'test'); foreach ( $tes ...

  5. maven测试时中文乱码问题解决方法

    pom.xml增加-Dfile.encoding=UTF-8配置,如下: <plugin> <!--升级到新版本解决控制台乱码问题--> <groupId>org. ...

  6. Mybatis新增mysql时中文乱码

    Mybatis新增mysql时中文乱码 1.设置数据库连接的编码(jdbc.properties) jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:my ...

  7. 使用PLSQL Developer时中文乱码问题

    使用PLSQL Developer时中文乱码问题 一.问题: 执行一些查询结果有中文的SQL语句,显示不了中文,显示???. 二.产生的原因: 客户端与服务器端的编码不一致造成的. 三.解决方案: 1 ...

  8. mysql 恢复数据时中文乱码

    mysql恢复数据时中文乱码,解决办法. 用source命令导入mysql数据库怎么设置中文编码 1.导出数据时指定编码在导出mysql sql执行文件的时候,指定一下编码格式: mysqldump ...

  9. 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)(转)

    这篇文章给大家介绍关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)的相关资料,还给大家收集些关于MySQL会出现中文乱码原因常见的几点,小伙伴快来看看吧   最近两天做项目总是被乱码问题困 ...

随机推荐

  1. MYSQL内存

    全局内存(BASE MEMORY) 线程内存(MEMORY PER CONNECTION) max_conecctions:整个 MySQL 允许的最大连接数; max_user_connection ...

  2. POJ 3233 Matrix Power Serie

    题意:给一个n×n的矩阵A,求S = A + A2 + A3 + … + Ak. 解法:从式子中可得递推式S(n) = S(n - 1) + An,An = An-1×A,可得矩阵递推式 [S(n), ...

  3. ie对行高line-height的诡异解释

    切 游戏页面真地是要求太精细了,做按钮的时候我犯了一个错误,居然用span的内联元素的行高和padding来控制,虽然有很多好处,但是IE对 line-height的解释导致按钮经常下边会缺一小部分, ...

  4. 用VBS脚本发邮件

    需求是这样的:针对账号的管理,如果发现该账号的管理员给账号加了批注,(比如要过期,修改密码,完善资料等),就需要找到这样的账号及其管理的邮件,然后发邮件给他们的管理员同时抄送给账号以达到提醒的目的.那 ...

  5. SeleniumIDE与eclipse如何连接使用

    [秦菲]SeleniumIDE与eclipse如何连接使用 1. 打开Firefox,利用IDE录制脚本(依次点击浏览器界面:工具->Selenium IDE)2. 把录制好的脚本转换成其他语言 ...

  6. duilib List控件,横向滚动时列表项不移动或者移动错位的bug的修复

    转载请说明出处,谢谢~~ 这篇博客已经作废,只是留作记录,新的bug修复博客地址:http://blog.csdn.net/zhuhongshu/article/details/42264673 之前 ...

  7. flashback table恢复数据

    flashback table恢复数据 flashback table主要是是用undo 表空间的内容,进行对数据修改的回退操作 语法如下: 根据scn号来进行回退 SQL> flashback ...

  8. Motan学习开篇

    你已经走到这里了,后面只要耐心的走下去就行了.   --佚名 入职新公司以后,公司使用dubbo框架,简单的照葫芦画瓢之后,也算是入手了,但是其中内部的实现的机制一概不懂.我单纯的有种好奇心,觉得每个 ...

  9. Trail: JDBC(TM) Database Access(3)

    java.sql,javax.sql,javax.naming包    默认TYPE_FORWARD_ONLY:结果集只能向前滚动,只能调用next(),不能重定位游标 TYPE_SCROLL_INS ...

  10. 【Spark学习】Apache Spark集群硬件配置要求

    Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4135912.html 目录 存 ...