JavaWeb中的中文编码问题
一.为什么要编码?
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类提供了从字符到字节的方法.
String str = "我是中文字符";
byte[] b = str.getBytes("UTF-8");
String ns= new String(s,"UTF-8");
只要设置编码格式统一,则一般情况下就不会出现乱码.
实际问题遇到的坑及其解决方法:http://www.cnblogs.com/fxust/p/7118416.html
JavaWeb中的中文编码问题的更多相关文章
- Java Web中的中文编码
Java Web开发中经常会遇到中文编码问题,那么为什么需要编码呢?因为人类需要表示的符号太多,无法用1个字节来表示,而计算机中存储信息最小单元为1个字节.所以必须指定char与byte之间的编码规则 ...
- 深入分析 Java 中的中文编码问题
登录 (或注册) 中文 IBM 技术主题 软件下载 社区 技术讲座 打印本页面 用电子邮件发送本页面 新浪微博 人人网 腾讯微博 搜狐微博 网易微博 Digg Facebook Twitter Del ...
- [转]深入分析 Java 中的中文编码问题
收益匪浅,所以转发至此 原文链接: http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ 深入分析 Java 中的中文编码问题 编 ...
- 在JavaWeb中使用Log4j步骤
在JavaWeb中使用Log4J指南.每次在开始写一个项目的时候都忘记Log4J如何配置.所以写个步骤,作为记录. 第一步 下载Log4J jar包 从Apache Logging Services ...
- 在Javaweb中使用Scala
Java 是一门比较优秀的编程语言, 其最大功劳是建立非常繁荣的JVM平台生态.不过 Java 语法比较麻烦,写过 C, Python 的人总是想使用简洁的语法,又希望利用上 Java 平台的强大,因 ...
- python处理url中的中文编码,以及其他编码问题
1.python中的urlencode与urldecode 2.各种编码转换在线工具 3.python用于url解码和中文解析的小脚本(python url decoder) 4.如何只对url中的中 ...
- 解析php开发中的中文编码问题
其实php开发中的中文编码并没有想像的那么复杂,虽然定位和解决问题没有定规,各种运行环境也各不尽然,但后面的原理是一样的. 了解字符集的知识是解决字符问题的基础. PHP程序设计中中文编码问题曾经困扰 ...
- 在javaweb中通过servlet类和普通类读取资源文件
javaweb有两种方式读取资源文件 在Servlet中读取,可以使用servletContext,servletContext可以拿到web所有的资源文件,然后随便读,但是这种方法不常用,尽量少在S ...
- 网站开发进阶(三十六)String.getBytes()方法中的中文编码问题
String.getBytes()方法中的中文编码问题 String的getBytes()方法是得到一个系统默认的编码格式的字节数组. getBytes("utf-8")得到一个U ...
随机推荐
- mysql中对应oracle中的to_char()和to_number()函数
TO_CHAR(): CAST(123 AS CHAR(3)) TO_NUMBER(): cast( '123 ' as SIGNED INTEGER)
- Objective-c 单例模式
用GCD写Objective-c的单例模式和C#有比较大的区别 声明h文件 #import <Foundation/Foundation.h> @interface me : NSObje ...
- .Net自带ChartControl报错:Auto interval does not have proper value
出现这个错误的原因是我们给ChartControl同时设置了Minimum和Maxmum的值,而这两个值又恰好相等. chart.ChartAreas[0].AxisY.Minimum=min; ch ...
- vmware虚拟机网络模式
转自:https://blog.csdn.net/u013201439/article/details/51491746 前言 有时因为工作和学习需要,我们安装了虚拟机,但是却发现不理解虚拟机的网络连 ...
- 笔画宽度变化(C++和matlab算法)
最近一直在看工作方面的书籍,把论文的事情搁置了,之前承诺的贴代码的事一直拖.现在把代码整理发上来,只有核心部分的,都不是我写的,我是网上整理下载的,matlab代码的效果比较差. 全部文件网盘下载地址 ...
- CoreThink主题开发(九)使用H-ui开发博客主题之用户个人主页
感谢H-ui.感谢CoreThink! 效果图: 这里使用table布局 /Theme/Blog/User/Index/home.html <extend name="$_home_ ...
- 剑指offer 面试56题
面试56题: 题目:数组中数字出现的次数 题:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 解题思路: 方法一:异或运算,详见<剑指offer&g ...
- C#如何使用结构化异常处理
Knowledge Base: Chinese (Simplified) 如何使用 Visual C# .NET 和 Visual C# 2005 中的结构化异常处理文章ID: 816157 最近更新 ...
- 乐思启慧教学系列—Bootstrap布局规则
1外层变化,内层相应变化规则 col-md-6 col-md-4 外层6变成12,扩大了2倍,里面就得缩小2倍(除以2), 只有这样才能保持外部变化了,内部依然对齐 col-md-12 col-md- ...
- typeset的常见用法
typeset用于设置变量属性,如大小写,宽度,左右对齐等都可以用typeset来控制, 当用typeset改变一个变量的属性时,这种改变是永久的,下面以ksh为例,演示typeset的几种典型用法 ...