最近在学习Socket的时候,遇到了中文乱码问题,在网上找到了一个说的很透彻的,这里分享一下:http://helloworlda.iteye.com/blog/1270703

现在问题是这样的:

打开2个ecplise,分别写上客户端和服务器端,数据传输用的是PrintStream方法来传的,当客户端发送数据过去之后,服务器端再把得到的数据返回过来,于是客户端显示的中文就成了乱码

解决方案:把服务器端的控制台printstream编码方式改成GBK:Run-Run Configuration-Common,设置一个GBK的编码格式

再次运行,显示中文正常,具体原因解释,参考引用说法:

JAVA的中文字符乱码问题一直很让人头疼。特别是在WEB应用中。网上的分析文章和解决方案都很多,但总是针对某些特定情况的。很多次遇到乱码问题后,经过极为辛苦的调试和搜索资料后终于解决,满以为自己已经掌握了对付这些字符乱码怪兽的诀窍。可当过段时间,换了个应用或换了个环境,又会碰到那讨厌的火星文,并再次无所适从。于是下决心好好整理一下中文字符编码问题,以方便自己记忆,也为其他程序员兄弟们提供一份参考。
首先要了解JAVA处理字符的塬理。JAVA使用UNICODE来存储字符数据,处理字符时通常有叁个步骤:
- 按指定的字符编码形式,从源输入流中读取字符数据
- 以UNICODE编码形式将字符数据存储在内存中
- 按指定的字符编码形式,将字符数据编码并写入目的输出流中。
 
      所以JAVA处理字符时总是经过了两次编码转换,一次是从指定编码转换为UNICODE编码,一次是从UNICODE编码转换为指定编码。如果在读入时用错误的形式解码字符,则内存存储的是错误的UNICODE字符。而从最初文件中读出的字符数据,到最终在屏幕终端显示这些字符,期间经过了应用程序的多次转换。如果中间某次字符处理,用错误的编码方式解码了从输入流读取的字符数据,或用错误的编码方式将字符写入输出流,则下一个字符数据的接收者就会编解码出错,从而导致最终显示乱码。
      这一点,是我们分析字符编码问题以及解决问题的指导思想。
      好,现在我们开始一只只的解决这些乱码怪兽。
 
一、在JAVA文件中硬编码中文字符,在eclipse中运行,控制台输出了乱码。
例如,我们在JAVA文件中写入以下代码:
String text = “大家好”;
System.out.println(text);
如果我们是在eclipse里编译运行,可能看到的结果是类似这样的乱码:????。那么,这是为什么呢?
我们先来看看整个字符的转换过程。
1. 在eclipse窗口中输入中文字符,并保存成UTF-8的JAVA文件。这里发生了多次字符编码转换。不过因为我们相信eclipse的正确性,所以我们不用分析其中的过程,只需要相信保存下的JAVA文件确实是UTF-8格式。
2. 在eclipse中编译运行此JAVA文件。这里有必要详细分析一下编译和运行时的字符编码转换。
- 编译:我们用javac编译JAVA文件时,javac不会智能到猜出你所要编译的文件是什么编码类型的,所以它需要指定读取文件所用的编码类型。默认 javac使用平台缺省的字符编码类型来解析JAVA文件。平台缺省编码是操作系统决定的,我们使用的是中文操作系统,语言区域设置通常都是中国大陆,所以平台缺省编码类型通常是GBK。这个编码类型我们可以在JAVA中使用System.getProperty(“file.encoding”)来查看。所以javac会默认使用GBK来解析JAVA文件。如果我们要改变javac所用的编码类型,就要加上-encoding参数,如javac -encoding utf-8 Test.java。
这里要另外提一下的是eclipse使用的是内置的编译器,并不能添加参数,如果要为javac添加参数则建议使用ANT来编译。不过这并非出现乱码的原因,因为eclipse可以为每个JAVA文件设置字符编码类型,而内置编译器会根据此设置来编译JAVA文件。
- 运行:编译后字符数据会以UNICODE格式存入字节码文件中。然后eclipse会调用java命令来运行此字节码文件。因为字节码中的字符总是 UNICODE格式,所以java读取字节码文件并没有编码转换过程。虚拟机读取文件后,字符数据便以UNICODE格式存储在内存中了。
3. 调用System.out.println来输出字符。这里又发生了字符编码转换。
System.out.println使用了PrintStream类来输出字符数据至控制台。PrintStream会使用平台缺省的编码方式来输出字符。我们的中文系统上缺省方式为GBK,所以内存中的UNICODE字符被转码成了GBK格式,并送到了操作系统的输出服务中。因为我们操作系统是中文系统,所以往终端显示设备上打印字符时使用的也是GBK编码。如果到这一步,我们的字符如果不是GBK编码的话,终端就会显示出乱码。
那么,在eclipse运行带中文字符的JAVA文件,控制台显示了乱码,是在哪一步转换错误呢?我们一步步来分析。
    - 保存JAVA文件成UTF-8后,如果再次打开你没有看到乱码,说明这步是正确的。
    - 用eclipse本身来编译运行JAVA文件,应该没有问题。
   - System.out.println会把内存中正确的UNICODE字符解码成GBK,然后发到eclipse的控制台去。等等,我们看到在Run Configuration对话框的Common标签里,控制台的字符编码被设置成了UTF-8!问题就在这里。System.out.println已经把字符编码成了GBK,而控制台仍然以UTF-8的格式读取字符,自然会出现乱码。
     将控制台的字符编码设置为GBK,乱码问题解决。
(这里补充一点:eclipse的控制台编码是继承了workspace的设置的,通常控制台编码里没有GBK的选项而且不能输入。我们可以先在 workspace的编码设置中输入GBK,然后在控制台的设置中就可以看到GBK的选项了,设置好后再把workspace的字符编码设置改回utf- 8就是。)

Socket传输中文乱码的更多相关文章

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

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

  2. ajax传输中文乱码解决方法

    问题描述: 我是在一个jsp页面有一个保存按钮,点击时会触发saveForm()的js函数,在saveForm()函数里经过校验后,会通过ajax发送数据请求,这样就不用通过提交表单来传输数据了,aj ...

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

    理想的开发状态是我开始就是C开发,一直是C的开发,现在还是C的开发,若干年后,幸运的话,我可以成为C语言的高手或者专家…… 更实际的情况是我开始是C开发,后来变成了JAVA开发,然后又做起了VC++的 ...

  4. java 页面传输中文乱码解决方式

    post 中文乱码解决方案 接受数据的时候设置 request.setCharacterEncoding("utf-8");//编码必须和页面编码一致 页面设置 <%@pag ...

  5. ajax GET 传输中文乱码

    关于客户端get传输到服务端乱码解决: <script> //ajakx 传输变量 var xmlhttp; if (window.XMLHttpRequest) {// code for ...

  6. 传输中文乱码js解决方法

    encodeURI要编码两次 var a="我的"; //编译两次 //window.location.href = "http://127.0.0.1:8080/kab ...

  7. 关于js向jsp中传输中文乱码问题

    最近做项目遇到的js向jsp中传中文结果是乱码,不知道是否是我换了用eclipse的原因还是什么,以前用的MyEclipse反正最后解决办法如下: 1.把js文件复制到桌面: 2.打开文件并用另存为u ...

  8. 解决Json传输中文乱码问题

    1.如果是通过URL传递:----需要编码两次 var searchText = this.searchText(); searchText = encodeURI(searchText); sear ...

  9. socket——本地服务器和android手机客户端通讯(防止中文乱码)

    线上效果图: 服务端接收到的. 客户端接受到服务器返回的. server端代码直接运行在本地就可以了. 手机客户端运行在手机上就行. 先安装客户端,再启动server.然后再输入文字,点击发送. se ...

随机推荐

  1. css 图片有间隔多个Img标签之间的间隙

    今天写css时发现,图片加起来刚好是900px的三张图片,不能在一个900px宽容器放下,因为图片之间有间隔,我猜是浏览器把两个img标签之间的空格当成了空白节点. 在网上找到了几个不错的解决方法: ...

  2. hdu 5435 A serious math problem

    A serious math problem Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...

  3. Python3学习笔记——类

    #!/usr/bin/env python #-*- coding:utf-8 -*- #面向对象(类+对象) 三大特性:封装.继承.多态 类的成员: 字段: 普通字段:保存在对象(实例)中,执行只能 ...

  4. 钉钉机器人SDK 封装预警消息发送工具

    1 群机器人     (1) 引言     钉钉聊天群内支持的群机器人, 类似QQ 群机器人, 可以发天气, 讲笑话那样;     钉钉群机器人支持自定义机器人, 允许开发者管理机器人做预警消息通知; ...

  5. layui table 中固定列的行高和table行高不一致

    解决方法:只需在done回调函数执行以下方法 done: function(res, curr, count){ $(".layui-table-main tr").each(fu ...

  6. python利用ConfigParser读写配置文件

    ConfigParser 是Python自带的模块, 用来读写配置文件, 用法非常简单. 配置文件的格式是: []包含的叫section,    section 下有option=value这样的键值 ...

  7. 小鱼易连 for mac如何使用?小鱼易连 mac版使用教程

    小鱼易连 for mac如何使用?小鱼易连 mac版是参加远程会议人士的首选,高效极致,简单流畅,视频流畅,语音清晰,无需专用网络的功能深受用户的喜欢,它提供的文件和电脑的共享,让你的会议更加高效.下 ...

  8. vue基础六

    列表渲染 1.v-for 我们用 v-for 指令根据一组数组的选项列表进行渲染. v-for 指令需要以 item in items 形式的特殊语法(也可以用of代替in), items是源数据数组 ...

  9. hdu 5279 YJC plays Minecraft——生成函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5279 令 n 个点的树的 EGF 是 g(x) ,则 \( g(x) = \sum\limits_{i=0 ...

  10. (转)Spring Boot干货系列:(七)默认日志logback配置解析

    转:http://tengj.top/2017/04/05/springboot7/ 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的, ...