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 ...
随机推荐
- PHP heredoc 用法2
参考网上的一个heredoc php模板实现的简单代码:index.php文件: <?php function template($template,$EXT ='htm') { $path = ...
- nginx + uwsgi + django/flask Nginx + php-fpm + PHP
后端服务器设置nginx + uwsgi + django/flask需要注意的问题 - ACE开发者 https://acejoy.com/2018/09/09/547/ 后端开发应用中,除了Ngi ...
- JavaScript数据结构与算法-链表练习
链表的实现 一. 单向链表 // Node类 function Node (element) { this.element = element; this.next = null; } // Link ...
- 高德地图API使用
1.根据地址找经纬度/修改经纬度 marker.setPosition(result.geocodes[0].location); map.setCenter(marker.getPosition() ...
- Vue.js刷新当前页面
Vue.js的路由跳转很强大,类似ajax的局部刷新,路由跳转时候页面是不刷新的,刷新当前页面的功能不建议用,但是有的时候确实需要刷新当前页面来实现某些需求,这个时候,我们有三 种方法可以实现. 第一 ...
- servlet 3.0 的新特性之三对异步处理的支持
一.异步处理 1. 什么是异步处理 原来,在服务器没有结束响应之前,浏览器是看不到响应内容的!只有响应结束时,浏览器才能显示结果! 现在异步处理的作用:在服务器开始响应后,浏览器就可以看到响应内容,不 ...
- 001 unique string
以后坚持每一个星期都写记到算法题,不论简单还是难,纯熟娱乐! 描写叙述: 实现一个算法来推断一个字符串中的字符是否唯一(即没有反复).不能使用额外的数据结构. (即仅仅使用主要的数据结构) 代码: # ...
- 转:9个offer,12家公司,35场面试 从微软到谷歌,应届计算机毕业生的2012求职之路 !!!
1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...
- java中参数传递的问题
public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer(" ...
- Linux中的环境变量配置文件及其作用
登录相关的配置文件: /etc/profile 范围:对所有用户生效 作用: a.定义USER变量 b.定义LOGNAME变量 c.定义MAIL变量 d.定义PATH变量 e.定义HOSTNAME变量 ...