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 ...
随机推荐
- 2015-03-06——ajax基础
IE6 必须使用Microsoft.XMLHTTP ActiveX组件来实例化一个对象 IE7已实现了XMLHttpRequest对象 var request = new ActiveXObject ...
- Java的默认构造函数调用
// 注意,这里不能是 public class OOO,否则编译无法通过,需把文件命名成 OOO.java class OOO { // 注意:如果不定义OOO(),那么Shapes(int i)编 ...
- Django 进阶(分页器&中间件)
分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views h ...
- python多线程(二)
开启线程的两种方式 #方式一from threading import Threadimport timedef sayhi(name): time.sleep(2) print('%s sa ...
- 001-Spring在代码中获取bean的几种方式
一.概述 方法一:在初始化时保存ApplicationContext对象 方法二:通过Spring提供的utils类获取ApplicationContext对象 方法三:继承自抽象类Applicati ...
- [转载]Spring中MultipartHttpServletRequest实现文件上传
实现图片上传 用户必须能够上传图片,因此需要文件上传的功能.比较常见的文件上传组件有Commons FileUpload(http://jakarta.apache.org/commons/file ...
- loadrunder脚本篇——文件读写操作
函数说明 函数原型: size_t fwrite( const void *buffer, size_t size, size_t count, FILE *file_pointer ); 参数说明 ...
- loadrunder之脚本篇——定义全局变量
如果参数是全局的,在脚本中的任何一个Action中都可以使用,变量一般是局部的,如果跨Action调用会出现未声明的错误. 打开Script视图中左侧Action列表中的globals.h文件,可定义 ...
- c# 内部类使用接口IComparer实现排序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- css系列(6)css的运用(二)
本节继续介绍css在html页面重的应用实例. (1)div的border-style属性: none: 无样式 hidden: 除了同表格的边框发生冲突的时候,其它同none dot ...