1.什么是编码 ,为什么要编码

先前从没有思考这么深入的问题,觉得一切理所当然,直到有一天java的乱码让我跪了,他不在听我的话,到处是乱码,这次我不打算放过它,我要收拾了它。

大家都知道,文本文件,存储在硬盘上,都是一串二进制  ,01的组合,它本身是不携带不论什么,哪怕一丁点,信息告诉文本编辑器 hi哥们儿,我是GBK编码,我是UTF-8编

码,我是。。。。。。。

它很easy,就是01的组合,他不知道自己是什么,所以我们仅仅有知道他是什么然后才干正确的编辑合适用它,首先看个小样例。

这是一个文本文件,他的二进制形式就是一串01

当我我用的终端的编码是GBK显示时(第一次)

当我用UTF-8时(第二次)

他就是这么简单 有是这么无常,非常幸运,这一串01不管是在GBK编码,还是在UTF-8中都是有效字符也就是说按UTF-8的编码规则它代表

”汉“   而假设依照GBK编码规则来解析呢他又是    ” 姹 “  ,这就是根源了,编码和解码用的不是一种码。所以大多数情况下你都搞不懂 好端端的文档怎么就乱了码。 这就是需

要编码的原因了。 二进制文件一串01电脑认得可是对他来说就是01没有意义。所以要把它翻译成大家能识别的东西。一种编码编码在我看来就是一种映射, 也就是向刚才所说

的GBK环

境下 它映射成一种东西,UTF-8,环境下它映射成还有一种东西,可是本质他俩有是一个东西,那客官又问了 ,明明再UTF-8和GBK环境下都一样,比方说a,这就说的到了,编

码与编码之间的兼容问题了,

想探索的朋友自己能够探索下,各个编码的规则及兼容性,这里就不多说了。

2. 上手编码

写java文件,就先来个helloworld

这是同一个文件 我在不同编码环境下查看,看到的东西是不一样的我的系统是Ubuntu 12.04 默认编码UTF-8  但是提前声明,我这个文件但是GBK编码的所以以GBK形式的编

码查看才有意义,张三 又立了功,下边来编译我的这个HelloWorld 文件,看看有什吗奇迹?

我去,不活啦 helloWorld 都搞不定,这都能出错,这日子没法过了。只是别着急,看错误, 这个字符(当然这里不是张三代表的字符找不到,而是再GBK里代表张三的0101

二进制串在UTF-8里找不到映射所以它没法解析,大家能够了解一下UTF-8的编码规则)UTF-8里找不着,没错  找不着就对了,你不是一次编译到处执行吗?编译都过不去怎么

搞,别着急 javac 里有一个參数,-encoding <encoding>       Specify character encoding used by source files  也就是说你告诉javac 你这个java源文件是什么样的编码,你别给

搞错了,你要是搞错了,幸运的,编译只是去告诉你哪里有问题,要是不幸的      汉  就变成了    姹 啦 想想就可怕   所以不报错并不代表程序没有问题 ,不信你试试,我刚才说

过,我的系统默认是UTF-8 所以没有编译过去这个是GBK编码的源文件,大多数人用的还是windows,并且又安装了中文语言包,所以默认编码大都GBK所以也就行正常编译

GBK编码的源文件,所以一般没有问题,但大多数程序终于上线执行的环境但是linux啊 ,全部大家设置虚拟机參数是-Dfile.encoding=GBK 这个是谁也不敢偷懒的。

(只是这里说这个还有点早)

当我加上这个參数 编译顺利通过。

感觉到非常神圣,执行我的helloWord

UTF-8环境下为

好兴奋啊  最终出来了

GBK环境下执行(这是大多数产生乱码的原因)

这不科学,怎么又乱了 神啊

大家肯定没有忘 java的class文件是什么编码的啊 Unicode对吧 所以张三这个字符串 所以编译完了 ,他就不是GBK了 全部的无论是什么编码的源文件,变成class文件编码都一样,你没告诉JVM使用什么编码,所以它默认UTF-8,所以张三被解析成UTF-8编码相应的一串二进制,但你的输出环境又是GBK所以。。。。

所以我老老实实的加上了 (这个命令行环境仍然是GBK)

System.out中的这个out是什么?PrintStream  是个输出流啊(默认是流向控制台当然你可已通过 System.setOut(PrintStream out)来让他流向别处,比方文本,然后用editplus打

开看下,通过设置不同的解码,来看不同的显示,当然不是必需这样)  打印到控制台,这个流你打算以什么编码来展示它,GBK环境下肯定是以GBK的形式展示吧,但是第一次是乱码为

什么,JVM是这样想

得,我有一个Unicode编码的张三在这里,我在说一下我的系统UTF-8在我没告诉JVM以什么编码规则编码时,它肯定使用UTF-8来编 你就会得到一个输入流 这个输入流是一串

00111二进制代表UTF-8下的张三,而到了输出到屏幕这里 屏幕(这里就是输出流流向的地方)不吃这一套 这一串00001111不代表张三,代表上边的那三个我也不太认识的字

(汗颜啊),所以咱得告诉虚拟

机,我要的张三是GBK编码的张三,我要的一串二进制相应GBK里的张三,所以加上个这个就好了。先写到这里吧!再晚赶不上二路汽车了。

下次再写个关于IO的编码的那个我感觉比这个简单点。(配合学习java的一些和编码相关的类效果更加)

先写到这里 ,祝大家 国庆节玩好。不要忘了 撸两行代码 怡怡情,由于几天不见,她没准就把你忘了。

深入解析java乱码的更多相关文章

  1. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  2. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  3. java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")

    http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...

  4. 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore

    前几篇分析了一下AQS的原理和实现.这篇拿Semaphore信号量做样例看看AQS实际是怎样使用的. Semaphore表示了一种能够同一时候有多个线程进入临界区的同步器,它维护了一个状态表示可用的票 ...

  5. 聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁

    上一篇聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁 讲了可重入读写锁的基本情况和基本的方法,显示了怎样 ...

  6. java乱码问题处理

    java乱码问题处理 java乱码出现的问题有很多,这里主要解释tomcat,jsp,html,http(get,post请求乱码处理).常见的问题可能是tomcat,http请求乱码问题,对于jsp ...

  7. 转 : 深入解析Java锁机制

    深入解析Java锁机制 https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw%3D%3D&mid=2247485524&idx=1&s ...

  8. 两道面试题,带你解析Java类加载机制

    文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...

  9. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

随机推荐

  1. 非对称加密算法RSA使用注意事项

    原文:非对称加密算法RSA使用注意事项 第一个问题,也是最重要的一个——RSA无法对超过117字节的数据进行加密!切记!其实也勿需要求对更大数据的加密,虽然网上已经有相关解决方案,比如BigInteg ...

  2. php+sqlite 最佳web服务器

    1 wampserver   支持mysql.每次都启动mysql,可以手动停止.但是运行时有时会很慢. 放弃 2 APS绿色版(Apache+PHP+SQLite)  组件环境:Apache2.2. ...

  3. 恶意软件&quot;跨平台&quot; 小心钱包很受伤

    什么是跨平台攻击? 举例来说.就像网络诈骗犯为了避开电子商务平台的监控.会在微博上发消息.百度上撒网,腾讯上联系,最后在淘宝上交易.这样的跨平台操作的模式会大大添加犯罪过程监控和取证的难度.而跨平台攻 ...

  4. Spark Executor Driver资源调度汇总

    一.简介 于Worker Actor于,每次LaunchExecutor这将创建一个CoarseGrainedExecutorBackend流程.Executor和CoarseGrainedExecu ...

  5. Visual Studio 2015使用EF6的ModelFirst模式添加实体数据模型缺少tt文件问题

    在看实体框架 (EF) 入门的时候,当按照样例做到ModelFirst的时候出问题了 这是使用vs2015新建的实体数据模型 这是官网样例 对比样例截图,会发现里面缺少.tt的文件.最重要的是最终代码 ...

  6. Cordova WP8 插件开发

    原文:Cordova WP8 插件开发 前面博客中介绍了Cordova WP8平台上的安装部署,Cordova扩展可以利用WP8本地代码扩展WebApp的功能,调用本地能力需要开发相应的插件,下面以闪 ...

  7. JEECG移动解决方案 - 针对移动应用的应用系统转换的中间件解决方案

     设想: 通过中间件配置,在业务系统中使用到移动应用程序的简单版本.(移动页面生成器) 实现方法: 当前移动应用解决方式非常多:app?html5?微信 採用何种方法来实现?对于一个企业来讲,app分 ...

  8. DotNetOpenAuth实践

    DotNetOpenAuth实践之搭建验证服务器 DotNetOpenAuth是OAuth2的.net版本,利用DotNetOpenAuth我们可以轻松的搭建OAuth2验证服务器,不废话,下面我们来 ...

  9. 揭秘上海传智播客平均工资超过7k 其中一位知情人士

    大学毕业生人数破700万大关.如何破解"毕业即失业"中国式的大学困境? 2014年全国高校毕业生总数将达到727万人,比被称为"史上最难就业年"的2013年再添 ...

  10. eclipse android ndk 提示Type 'JNIEnv' could not be resolved 等信息解决办法

    新配置完eclipse c++ android ndk 环境后,导入项目提示以下信息 是由于没有将jni.h导入的缘故,而这个文件在ndk的目录下面.所以,参照以下步骤:Project Propert ...