一.为什么要编码?

1.在计算机中存储信息的最小单元是1字节,即8个bit,所以能表示的字符范围是0~255个.

2.人类要表示的符号太多,无法用1个字节来完全表示.

这就是矛盾,要解决这个矛盾,就出现了一种新的数据结构char,而从char到byte必须编码.

二.几种编码格式

1.ASCII码

  学计算机的不知道ASCII,我擦,那你Low爆了.总共有128个,用1个字节的低7位表示,0~31是控制字符如换行,回车,删除等,32~126是打印字符,可通过键盘输入并且能够显示出来.

2.ISO-8859-1

  很显然,128个字符是不够用的,于是ISO组织制定了一系列标准来扩展ASCII编码,它们兄弟比较多,ISO-8859-1到ISO-8859-15,老大还是老大,其中ISO-8859-1人家就比较牛,掌握了大多数西欧语言字符,应用最广泛.但是ISO-8859-1仍然是单字节编码,总共能表示256个字符.

3.GB2312

  知道全称吗?好吧我也不知道.全称<信息技术中文编码字符集>,它是双字节编码,总编码范围是A1~F7,其中A1~A9是符号区,总共包含682个符号;B0~F7是汉子区,包含6763个汉子.

4.GBK

  搞数据库的一定接触过GBK,全称<汉字内码扩展规范>,为扩展GB2312而出生,并加入更多汉字.编码范围8140~FEFE(去掉XX7F),总共有23940个码位,能表示21003个汉字,和GB2312兼容,所以GB2312编码,可以用GBK解码,不会出现乱码.

5.GB18030

  全称也是<信息技术中文编码字符集>,是咱们国家的强制标准,它可能是单字节,双字节或者四字节编码,与GB2312兼容,虽说是国家标准,实际系统应用并不广泛.

6.UTF-16

  UTF-16定义了Unicode字符在计算机中的存取方法,用两个字节表示Unicode的转化格式,采用定长的表示方法.两个字节是16个bit,所以叫UTF-16.它表示字符非常方便,每两个字节表示一个字符,这就大大简化了字符串的操作.这也是Java以UTF-16作为内存的字符存储格式的很重要的原因.

7.UTF-8

  UTF-16虽然简单好用,但是用两个字节,存储空间放大了1倍,并且采用顺序编码,不能对单个字符的编码值进行校验.而UTF-8采用变长技术(好像char与varchar),每个编码区域有不同的字码长度,不同类型的字符可以由1~6个字节组成.单字节范围内的字符采用1个字节表示,对汉字则采用3个字节表示.

三.Java中的编码场景.

1.在I/O操作中需要编码

  编码一般涉及到从字节到字符,或从字符到字节,这种转换场景主要是I/O(网络IO,磁盘IO)

  

  Reader 类是 Java 的 I/O 中读字符的父类,而 InputStream 类是读字节的父类,InputStreamReader 类就是关联字节到字符的桥梁,它负责在 I/O 过程中处理读取字节到字符的转换,而具体字节到字符的解码实现它由 StreamDecoder 去实现,在 StreamDecoder 解码过程中必须由用户指定 Charset 编码格式。值得注意的是如果你没有指定 Charset,将使用本地环境中的默认字符集,例如在中文环境中将使用 GBK 编码.

  写也是类似滴,字符的父类是 Writer,字节的父类是 OutputStream,通过 OutputStreamWriter 转换字符到字节.看图:

  应用程序中涉及到 I/O 操作时只要注意指定统一的编解码 Charset 字符集,一般不会出现乱码问题,有些应用程序如果不注意指定字符编码,中文环境中取操作系统默认编码,如果编解码都在中文环境中,通常也没问题,但是还是强烈的不建议使用操作系统的默认编码,因为这样,你的应用程序的编码格式就和运行环境绑定起来了,在跨环境下很可能出现乱码问题.

2.在内存操作中需要编码

  String类提供了从字符到字节的方法.

  1. String str = "我是中文字符";
  2. byte[] b = str.getBytes("UTF-8");
  3. String ns= new String(s,"UTF-8");

只要设置编码格式统一,则一般情况下就不会出现乱码.

实际问题遇到的坑及其解决方法:http://www.cnblogs.com/fxust/p/7118416.html

JavaWeb中的中文编码问题的更多相关文章

  1. Java Web中的中文编码

    Java Web开发中经常会遇到中文编码问题,那么为什么需要编码呢?因为人类需要表示的符号太多,无法用1个字节来表示,而计算机中存储信息最小单元为1个字节.所以必须指定char与byte之间的编码规则 ...

  2. 深入分析 Java 中的中文编码问题

    登录 (或注册) 中文 IBM 技术主题 软件下载 社区 技术讲座 打印本页面 用电子邮件发送本页面 新浪微博 人人网 腾讯微博 搜狐微博 网易微博 Digg Facebook Twitter Del ...

  3. [转]深入分析 Java 中的中文编码问题

    收益匪浅,所以转发至此 原文链接: http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ 深入分析 Java 中的中文编码问题 编 ...

  4. 在JavaWeb中使用Log4j步骤

    在JavaWeb中使用Log4J指南.每次在开始写一个项目的时候都忘记Log4J如何配置.所以写个步骤,作为记录. 第一步 下载Log4J jar包 从Apache Logging Services ...

  5. 在Javaweb中使用Scala

    Java 是一门比较优秀的编程语言, 其最大功劳是建立非常繁荣的JVM平台生态.不过 Java 语法比较麻烦,写过 C, Python 的人总是想使用简洁的语法,又希望利用上 Java 平台的强大,因 ...

  6. python处理url中的中文编码,以及其他编码问题

    1.python中的urlencode与urldecode 2.各种编码转换在线工具 3.python用于url解码和中文解析的小脚本(python url decoder) 4.如何只对url中的中 ...

  7. 解析php开发中的中文编码问题

    其实php开发中的中文编码并没有想像的那么复杂,虽然定位和解决问题没有定规,各种运行环境也各不尽然,但后面的原理是一样的. 了解字符集的知识是解决字符问题的基础. PHP程序设计中中文编码问题曾经困扰 ...

  8. 在javaweb中通过servlet类和普通类读取资源文件

    javaweb有两种方式读取资源文件 在Servlet中读取,可以使用servletContext,servletContext可以拿到web所有的资源文件,然后随便读,但是这种方法不常用,尽量少在S ...

  9. 网站开发进阶(三十六)String.getBytes()方法中的中文编码问题

    String.getBytes()方法中的中文编码问题 String的getBytes()方法是得到一个系统默认的编码格式的字节数组. getBytes("utf-8")得到一个U ...

随机推荐

  1. PHP heredoc 用法2

    参考网上的一个heredoc php模板实现的简单代码:index.php文件: <?php function template($template,$EXT ='htm') { $path = ...

  2. nginx + uwsgi + django/flask Nginx + php-fpm + PHP

    后端服务器设置nginx + uwsgi + django/flask需要注意的问题 - ACE开发者 https://acejoy.com/2018/09/09/547/ 后端开发应用中,除了Ngi ...

  3. JavaScript数据结构与算法-链表练习

    链表的实现 一. 单向链表 // Node类 function Node (element) { this.element = element; this.next = null; } // Link ...

  4. 高德地图API使用

    1.根据地址找经纬度/修改经纬度 marker.setPosition(result.geocodes[0].location); map.setCenter(marker.getPosition() ...

  5. Vue.js刷新当前页面

    Vue.js的路由跳转很强大,类似ajax的局部刷新,路由跳转时候页面是不刷新的,刷新当前页面的功能不建议用,但是有的时候确实需要刷新当前页面来实现某些需求,这个时候,我们有三 种方法可以实现. 第一 ...

  6. servlet 3.0 的新特性之三对异步处理的支持

    一.异步处理 1. 什么是异步处理 原来,在服务器没有结束响应之前,浏览器是看不到响应内容的!只有响应结束时,浏览器才能显示结果! 现在异步处理的作用:在服务器开始响应后,浏览器就可以看到响应内容,不 ...

  7. 001 unique string

    以后坚持每一个星期都写记到算法题,不论简单还是难,纯熟娱乐! 描写叙述: 实现一个算法来推断一个字符串中的字符是否唯一(即没有反复).不能使用额外的数据结构. (即仅仅使用主要的数据结构) 代码: # ...

  8. 转:9个offer,12家公司,35场面试 从微软到谷歌,应届计算机毕业生的2012求职之路 !!!

    1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...

  9. java中参数传递的问题

    public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer(" ...

  10. Linux中的环境变量配置文件及其作用

    登录相关的配置文件: /etc/profile 范围:对所有用户生效 作用: a.定义USER变量 b.定义LOGNAME变量 c.定义MAIL变量 d.定义PATH变量 e.定义HOSTNAME变量 ...