要对Java Web项目进行编码原因:
1、在计算机中存储信息的最小单位是1个字节,即8个bit,所以能表示的字符范围是0~255个。
2、电脑需要表示的符号太多、无法用1个字节完全表示。
要解决这个问题,必须要有一个新的数据结构char,而从bit到char就要进行编码。
常见的编码格式:
1、ASCII码
总共128个,用1个字符的低7位表示,0~31是控制字符,如换行、回车、删除等。32~126是打印字符,可以通过键盘输入并且表示出来
2、ISO-8859-1
ISO组织在ASCII的基础上又制定了一系列标准来就、扩展ASCII编码,他们是ISO-8859-1和ISO-8859-15。其中前者涵盖了大多数西欧语言字符,所以运用得比较广泛。ISO-8859-1仍然是单字节编码,它总共能表示256个字符.
因为ISO-8859-1是单字节的,所以很多中文字符(两个字节)在编码时用ISO-8859-1表示时,因超出表示范围,所以出现??很多情况是将中文字符用ISO-8859-1表示。我们称之为“黑洞”(它会将不认识的字符吸收掉)。
由于现在大部分基础的Java框架或系统默认的字符集编码都是ISO-8859-1,所以很容易出现乱码问题。
3、GB2312
GB2312是双字节编码,总的编码范围是A1-F7,其中A1-A9是符号区,总共有682个符号,B0-F7是汉字区,包含6763个汉字。
4、GBK
GBK全称是 汉字内码扩展规范,是中国国家技术监督局开发出来扩展GB2312,并加入了更多的汉字,它的编码范围是8140~FEFE,能表示21003个汉字。它与GB2312是兼容的。
5、GB18030
Gb18030全称是 信息技术中文编码字符集,是我国的强制标准,它可能是单字节的、双字节或者是四字节编码。它的编码与GB2312编码兼容。
6、UTF-16
ISO试图创建一个全新的超语言字典,世界上的语言都能使用这个字典进行翻译。UTF-16具体定义了Unicode字符在计算机中的存取方法,UTF-16用两个字节来表示Unicode的转化格式,它采用定长的表示方法,即无论什么字符都可以用两个字节表示。两个字节就是16个bit,所以叫做UTF-16。Java以UTF-16作为内存中字符存储格式。
7、UTF-8
UTF-8采用变长的方法,克服了UTF-16中定长的浪费资源的缺点。每个编码区域都有自己不用的字码长度,不同类型的字符可以由1~6个字节组成。
UTF-8对单字节范围内的字符仍然用1个字节表示,对汉字采用3个字节表示。
UTF-8的编码规则:当是1个字节的时候,最高位为0,则表示这是一个ASCII字符,由此可见,所有ASCII编码已经是UTF-8.
当是1个字节,以11开头,则连续的1的个数暗示这个字符的字节数,如110XXXXX表示它是双字节UTF-8字符的首字节。
当是1个字节,以10开头,表示它不是首字节。则需要向前查找才能得到它的首字节。
上述几种编码格式的比较:
GBK能处理所有的汉字字符,所以将GB2312和GBK进行比较时,应该选择GBK。
UTF-8与UTF-16都是处理Unicode编码,尽管他们的编码格式不相同,但相对来说,UTF-16的编码效率较高,从字符到字节的转换更简单,进行字符串操作也更好,适合磁盘和内存之间使用,所以Java的内存编码采用UTF-16来编码。但是在网络传输的时候,应使用UTF-8,因为网络传输比较容易损坏字节流,而UTF-8对ASCII字符采用了单字节编码,另外单个字节损坏不会影响到后面的其他字符,在编码效率中介于GBK和UTF-16之间,所以,UTF-8在编码效率和编码安全性方面都做了平衡,是理想的中文编码方式。
在Java中需要编码的场景:涉及到字符到字节或者字节到字符的转换上。分为下面两类:
在I/O操作中存在的编码
在内存操作中的编码
在Java中编解码,如
String name = "today 天气真好";
byte[] iso8859 = name.getBytes("ISO-8859-1");
byte[] gb2312 =name.getBytes("GB2312");
将字符串按照相应的编码格式进行编码,转换为byte数组。
String。getBytes(charsetName)编码过程:根据charsetName找到Charset类,然后根据这个字符集编码生成CharserEncoder,这个类是所有字符编码的父类,针对不同的字符编码集在其子类中定义了如何实现编码,有了CharserEncode对象后就可以条用encode方法实现编码了。
常见问题分析
1、中文变成了看不懂的字符
字符串在解码时所用的字符集和编码的时候所用的字符集不一致时就会导致汉字变成看不懂的乱码,而且是一个汉字字符变成两个乱码字符。
2、一个汉字变成一个问号
将中文和中文符号经过不支持中文的IDO-8859-1编码后,所有字符变成了“?”。这是因为ISO-8859-1在编解码的时候,遇到不在码值范围内字符会统一用3f表示,这也就是“黑洞”。而ISO-8859-1不认识的字符变成了“?”。
3、一个汉字变成两个问号
中文经过多次编码,但是其中有一次编码或者解码不对而出现以上情况。
4、一种不正常的正确编码
有时候我们会发现,当你在Jsp页面获取到参数时,String value = request.getParameter("name");会出现乱码。而使用 String value = String(request.getParameter("name".getBytes("ISO-8859-1"),"GBK"));时就能正常显示中文。
事实上是这样子的,ISO-8859-1字符集的编码范围是0000~00FF,正好和一个字节的编码范围相对应。这种特性保证了使用ISO-8859-1进行编码和解码时编码数值不变。虽然中文字符在网络传输的过程中,被错误地拆分为两个欧洲字符,但由于输出的时候也使用了ISO-8859-1,结果被拆开的中文字又被合并,刚好组成了一个正确的汉字。缺点是增加多一次编码。
彻底解决该问题的方法是,在Tomcat的配置文件中将useBodyEncodingURI配置项设置为“true”。
网站国际化:
将网站的文字转换语言形式。首先要将网站的编码格式设置为支持多种语言的UTF-8编码,然后对页面进行本地化翻译工作。本地化翻译分为:机器自动翻译,类似于Google翻译或者是Office繁简转换;人工翻译,代价较高。前者技术难度高,且有些语义难以准确翻译。后一种系统维护麻烦。
例子:由繁到简过程:由人工翻译将简体中文的GBK编码汉字转换为繁体的Big5编码汉字,形成一个码表。由于汉字字符的字节特性,在两个连续的字节的最高位都大于1时,用这两个连续的字节组合起来从码表中查找,进行对照翻译。这个查找和翻译的工作在前端的Web服务器上动态完成,自动将后台输出的简体中文转换为繁体中文。但是也存在有些词组翻译不好,很难解决跨语言问题。
- 【中文乱码】深入分析 Java Web 中的中文编码问题
深入分析 Java Web 中的中文编码问题 1.几种常见的编码格式 1.1 为什么要编码 在计算机中存储信息的最小单元是 1 个字节,即 8 个 bit, 所以能表示的字符范围是 0 ~ 255 个 ...
- 第三章 深入分析Java Web中的中文编码问题
3.1 几种常见的编码格式 3.1.1 为什么要编码 一个字节 byte只能表示0~255个符号,要表示更多的字符,需要编码. 3.1.2 如何翻译 ASCII码:有128个,用一个字节的低7位表示. ...
- Java Web中的中文编码
Java Web开发中经常会遇到中文编码问题,那么为什么需要编码呢?因为人类需要表示的符号太多,无法用1个字节来表示,而计算机中存储信息最小单元为1个字节.所以必须指定char与byte之间的编码规则 ...
- 深入分析Java Web中的编码问题
编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...
- 深入分析Java Web技术内幕(修订版)
阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著 ISBN 978-7-121- ...
- 《深入分析Java Web技术内幕》读书笔记 - 第1章 深入Web请求过程
第1章 深入Web请求过程 1 1.1 B/S网络架构概述 2 基于统一的应用层协议HTTP来交互数据. 1.2 如何发起一个请求 4 HTTP连接本质是建立Socket连接.请求实现方式:工具包如H ...
- 深入分析Java Web技术内幕
深入web请求过程 发起一个http请求的过程就是建立一个socket通信的过程 HTTPClient是一个开源的实现了http请求的工具包 深入分析java I/O的工作机制 深入分析java We ...
- JAVA Coder 的《深入分析Java Web 技术内幕》读书笔记
本文基于<深入分析Java Web 技术内幕> <深入分析Java Web 技术内幕>,作者是 许令波,电子工业出版社.本文只是记录书本当中的精彩部分,作个人回顾和技术分享,请 ...
- Java web中常见编码乱码问题(一)
最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...
随机推荐
- vim自动添加注释
我想了下,要做好一件事, 1,首先喜欢它最才有动机去了解它 2,道听途说about那东西的,会去了解并去玩转 3,兴趣需要培养 一 添加vim头部信息. 系统:C67 追加以下代码到 /etc/vim ...
- C语言 百炼成钢8
//题目22:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定 //比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x, z比,请编程序找出 //三 ...
- CAN开发中遇到的奇怪问题
问题背景: 之前在做USBCAN2开发过程中,遇到一个奇葩问题,当我们加上其中某一句代码时,我们的程序会走不下去,得不到数据,而且在调试的过程中,你也不能暂停,不然,你也得不到数据.后来参考网上一篇帖 ...
- Gradle tip #2: understanding syntax
In the Part 1 we talked about tasks and different stages of the build lifecycle. But after I publish ...
- jQuery上传插件Uploadify使用帮助
Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.它的功能特色总结如下: 支持单文件或多文件上传,可控制并发上传的文件数 在服务器端支持各种语言与之配合使用,诸如PHP, ...
- mysql存储过程出参入参,sqlserver很熟悉的一件事到mysql,捣鼓了大半天。记录一下提醒自己。勿看
create PROCEDURE myTestProcname(in score int ,out result varchar(100))BEGINIF score>60 THENset re ...
- HoloLens开发手记 - Unity之World Anchor空间锚
World Anchor空间锚提供了一种能够将物体保留在特定位置和旋转状态上的方法.这保证了全息对象的稳定性,同时提供了后续在真实世界中保持全息对象位置的能力.简单地说,你可以为全息物体来添加空间锚点 ...
- 小白学习mysql之函数
## 导语 曾经我以为,学会了select.update.insert和delete之后,我就学会了数据库~,要不是到公司看到SQL里充满了密密麻麻的的各种函数,我差点就信了~,当初的自己是多么的天真 ...
- Andriod Studio Clear Project或Rebuild Project出错
以前在Eclipse中出现过类似的错误:在编译工程时,提示无法删除bin目录下的某个jar. 想不到Android Studio中也会有. Clear Project或Rebuild Project, ...
- 编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]
前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正. 建议1. ...