java编码解码过程
最近做项目的时候,有时会遇到中文乱码的问题,网上查询了很多资料,发现大多都是只讲解决方案,并没有讲到为什么要使用这种方案,这种方案的原理是什么?
最典型的就是连接数据库的URL,我们一般把它放到classpath下的db.properties中,然后尽管我们的java代码设置了UTF-8,JSP也设置了UTF-8,数据库也设置了UTF-8,但是插入数据到数据库中仍然会出现中文乱码,最后我们的解决方案是在连接数据库的URL上加上连接使用的编码格式UTF-8,但是我们会纳闷为什么要这么做呢?
下面我们来聊下java编码的问题,为什么要编码,有哪些编码,怎么编码和解码,为什么会有中文乱码,怎么解决中文乱码。
1.为什么要编码
这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言。由于人类的语言太多,因而表示这些语言的符号太多,无法使用计算机中一个基本的存储单元---byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机理解我们的语言。我们可以把计算机能够理解的语言假定为英语,其他语言要能够在计算机中使用必须经过一次翻译,把它翻译成英语。这个翻译的过程就是 编码。
所以总的来说,编码的原因可以总结为:计算机中存储信息的最小单元是一个字节,即8个bit,所以能表示的字符范围是0-255个;人类要表示的符号太多,无法用一个字节来完全表示。
要解决这个矛盾必须要有一个新的数据结构char,从char到byte必须编码。
2.常见的编码
明白了各种语言需要交流,经过翻译是必须的,那么又如何来翻译呢?计算机中提供了多种翻译方式,常见的右ASCII,ISO-8859-1,GB2312,GBK,UTF-8,UTF-16等。他们可以被看做字典,他们规定了转化的规则,按照这个规则可以让计算机正确地标识我们的字符。目前的编码格式很多,如GB2312,GBK,UTF-8,UTF-16都可以标识一个汉字,那我们到底选择哪种编码格式来存储汉字呢?这就要考虑其他因素呢,是存储空间重要还是编码的效率重要。
3.怎么编码,解码
以String为例,代码如下:
String s="这是一段中文字符串";
byte[] b=s.getBytes("UTF-8");
String n=new String(b,"UTF-8");
编码的用途:把我们用户能够认识的语言转化为计算机能够认识的语言,一般用在传输或者存储时,也就是涉及到计算机的操作而不是针对用户而言。
解码:把字节码解释为我们用户能够认识的语言。
4.为什么有中文乱码
第一种情况:使用不能识别中文的字符集来编码,这种情况比较少见
第二种情况,使用一种字符集来编码,却用另一种字符集来解码,这种比较多见,比如,java代码采用UTF-8编码,但是访问数据库的时候,数据库采用GBK来解码,这就会出现中文乱码。
Charset使用
Charset charset=Charset.forName("UTF-8");
ByteBuffer byteBuffer=charset.encode(string);
CharBuffer charBuffer=charset.decode(byteBuffer);
5.java中怎么编解码
String name="I am 小明";
toHex(name.toCharArray());
<span style="font-size:18px; white-space: pre;"></span><pre name="code" class="java">try{
byte[] iso8859=name.getBytes("ISO-8859-1");
toHex(iso8859);
byte[] gb2312=name.getBytes("GB2312");
toHex(gb2312);
byte[] gbk=name.getBytes("GBK");
toHex(gbk);
}
String str="小米";
byte[] b=str.getBytes("UTF-8");
public byte[] getBytes(String charsetName)
throws UnsupportedEncodingException {
if (charsetName == null) throw new NullPointerException();
return StringCoding.encode(charsetName, value, , value.length);
}
static byte[] encode(String charsetName, char[] ca, int off, int len)
throws UnsupportedEncodingException
{
StringEncoder se = deref(encoder);
String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
if ((se == null) || !(csn.equals(se.requestedCharsetName())
|| csn.equals(se.charsetName()))) {
se = null;
try {
Charset cs = lookupCharset(csn); //生成字符集实例
if (cs != null)
se = new StringEncoder(cs, csn);
} catch (IllegalCharsetNameException x) {}
if (se == null)
throw new UnsupportedEncodingException (csn);
set(encoder, se);
}
return se.encode(ca, off, len);
}
private static Charset lookupCharset(String csn) {
if (Charset.isSupported(csn)) {
try {
return Charset.forName(csn);
} catch (UnsupportedCharsetException x) {
throw new Error(x);
}
}
return null;
}
private StringEncoder(Charset cs, String rcn) {
this.requestedCharsetName = rcn;
this.cs = cs;
this.ce = cs.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE);
this.isTrusted = (cs.getClass().getClassLoader0() == null);
}
原创:https://blog.csdn.net/u010627840/article/details/50407575
java编码解码过程的更多相关文章
- 常用的js、java编码解码方法
前言 前后端直接传输数据进行交互不就行了吗,为什么还要进行编码解码?正常情况下直接交互没问题,但当有类似以下情况出现时就需要进行编码再进行传输: 1.编码格式难以统一,导致数据交互过程出现中文乱码等问 ...
- 签名、BOM头、编码、Windows记事本编码、java编码解码的那些事
对于Windows记事本: ANSI :GB2312 java中应使用GBK解码 Unicode :有签名的UTF-16LE java中应使用UTF-16解码 Unicode big endian : ...
- java编码解码乱码问题
服务器设值(中文)到界面使用了两次编码: String pageJson=URLEncoder.encode(URLEncoder.encode(str,"GBK"), " ...
- JAVA 编码解码
涉及编码的地方一般都在从字符到字节或是从字节到字符间的转换上 1.在IO中存在的编码,主要是 FileOutputStream 和 FileInputStream,在使用时需要指定字符集,而不是使用系 ...
- java中文乱码解决之道(五)-----java是如何编码解码的
在上篇博客中LZ阐述了java各个渠道转码的过程,阐述了java在运行过程中那些步骤在进行转码,在这些转码过程中如果一处出现问题就很有可能会产生乱码!下面LZ就讲述java在转码过程中是如何来进行编码 ...
- java中文乱码解决之道(六)-----javaWeb中的编码解码
在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...
- java中文乱码解决之道(六)—–javaWeb中的编码解码
在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...
- java中文乱码解决之道(五)—–java是如何编码解码的
原文出处:http://cmsblogs.com/?p=1491 在上篇博客中LZ阐述了java各个渠道转码的过程,阐述了java在运行过程中那些步骤在进行转码,在这些转码过程中如果一处出现问题就很有 ...
- java学习-http中get请求的非ascii参数如何编码解码探讨
# 背景: 看着别人项目代码看到一个PathUtils工具类, 里面只有一个方法,String rebuild(String Path),将路径进行URLDecoder.decode解码,避免路径中 ...
随机推荐
- leetcode-简单-栈-逆波兰表达式
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话 ...
- Linux运维--15.OpenStack vm使用keepalived 实现负载均衡
外接mariadb集群 实现负载均衡 实验环境 10.0.1.27 galera1 10.0.1.6 galera2 10.0.1.23 galera3 10.0.1.17 harpoxy1 hapr ...
- Caliburn.Micro框架之Action Convertions
首先新建一个项目,名称叫Caliburn.Micro.ActionConvertions 然后删掉MainWindow.xaml 然后去app.xaml删掉StartupUri这行代码 其次,安装Ca ...
- Android开发之adt bundle安装
这个学期开了一门手机游戏开发的课,所以就接触到了adt bundle,Android开发环境有三种方式,分别是JDK+SDK+Eclipse+ADT.JDK+adt-bundle与JDK+Androi ...
- 如何实现广告响应式滚动 OwlCarousel2
githu https://github.com/OwlCarousel2/OwlCarousel2 OwlCarousel2 官方网址 http://owlcarousel2.githu ...
- 【已解决2】pyinstaller UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position 110: invalid continuation byte
python打包exe解码错误问题 最近做了一个小项目,其中把自己写的python打包成exe文件.我用的是pyinstaller. 只需要打包主程序py文件就ok. 在打包过程中,遇到一 ...
- 算法训练 最大获利 注意数据规模(long long)
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Chakra是一位年轻有为的企业家,最近他在进军餐饮行业.他在各地开拓市场,共买下了N个饭店.在初期的市场调研中,他将一天划分为M ...
- 阿里妈妈的iconfont的引用问题
一.先进官网 我们看到了上面的这些图标,是不是很心动,阿里妈妈就是给力,给马老师点赞,但是问题来了我们怎么去使用呢. 二.点击图标 嘿嘿,上面的操作步骤我就不多说了吧,我相信大家都会做的,接下来我们就 ...
- webApi前端ajax调用后端返回{"readyState":0,"status":0,"statusText":"error"}解决方案
var url = data.url, params = data.params, try_times = data.try_times , async = data.sync == 'false' ...
- C# MVC Api无法获得参数
在MVC中写API时,没有收到参数如何解决? 通过jQuery.POST测试成功.后来又通过F12发送,发现始终无法收到参数. 注:我的接口接收参数是一个类对象,没有写[FromBody]) [Htt ...