编码基础知识参考http://my.oschina.net/chape/blog/201725

我对此作了简单的概括

iso8859-1 (通常叫做Latin-1)

属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列,无法表示中文,比如,字母a的编码为0x61=97

GB2312/GBK

汉字的国标码,专门用来表示汉字,是不定长双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。即GB2312兼容IOS8859-1,GBK兼容GB2312和ISO8859-1

unicode

这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,即不管是中文还是字母都是两个字节,且不兼容任何编码,所以容易浪费很多空间,不利于传输和存储。相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母a为"00 61。

定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java

UTF

考虑到unicode的不足,产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符

UTF是不定长编码,每一个字符的长度从1-6个字节不等,自带简单的校验功能,一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。

在考虑选择编码使用的情况下,如果知道使用的都是中文,那么用GB2312/GBK无疑是最省空间的,如果知道了都是不含中文,可以考虑用ISO8859-1。

但是我们一般网页是既含中文也含英文的,GB2312/GBK是国标码,在中国比较通用,而utf是国际支持的,如果用GB2312/GBK,国外访问国内网站,浏览器不支持自动转码,就会出现乱码。所有建议网页上使用utf编码。

关于编码的内部实现不深入研究,这里举个例子

以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687"

java中getBytes(charset)

不指定cahrset集时getBytes()默认采用平台默认的编码集,什么是平台默认的编码集呢?就是.java文件保存的编码

比如我的eclipse里保存.java文件为

aaarticlea/png;base64,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" alt="" />

测试

     String str="哈哈ha1";
byte b[]=str.getBytes();
System.out.println(b.length);

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAALUAAABUCAIAAABLKeHZAAADRUlEQVR4nO2ayZXbMBAFERcCQjwIwVEwCmWAky+OwG9OtjgHbli/RBKyZ6iqp4NEUkR3s9iAFjM2uN1uP399rI9xHH9//Lnk4+/9fr+PPKoPgx+tCsA47vED3hD8AAV+gAI/QIEfoPjafgRvjfXhlUMM7tUjfGvwY58fgzM5bugSRXKqV1kbvN0XcF8/grddynWGnTEcvBKDO5JoM7b8dC/yI3hr7a7y4Mcb+RG8tT7sCv20H1vHilrvnNu2ZUl2KtDg5k2DM9YP3q7NdXnHfPxWz8EZ6326dxk9avPPxDDms8S6Y8d0Vha5MlAaXRlb+3SxH3mOSZTbi/yw6qWyPmTyRVckee+8/bAfSzhJqvH9kae45pZOs8sZpginPcnhqx/x3qUkbhlhcMWbWzFsh84vihSeWFZkF7Q2UKVZHOgftRzjvWulKqUoxtjumcy+qGBRGY1xh/xornKi/IuFnPWhKFAcaO151j+2lNod5GEMWetudfIHK7n0gtaTnbbGZz84vxQ5lvWpHpYPUat1FlJ+a57uH0ko6bWp1L2rH8Hbykz0KIYHfhzqH2q5MJ1wmwOe8SPNpsxxHnC7URqHpSNklO127OhHkn46aW0BRW28Gs05P7K7oD6/lDHEG+O6nll/1AYK3udledKPKI56jlMNnFv7aOuweoDx6+L6xWK64+uPOvPd11wx9Z1ftgGsc+uJH8WQLiV9p88vtYHqqz6j1qf5FyGNHAsNWodFkaTbli3BW+NcEei6vVWAL/H92Ntw7ONyD1otrdf8Aj0o2sY/Az9AgR9wgt1+/IB3gv4BCvwABX6AAj9AgR+gwA9QnPKj/H0BLsYJPwZnrI+e8ifwC3Lcj+Bt8kvs4gpciT79Y/ff5uGbcGr9Ef3pwCfdBK5Cr88vzC/XpI8f/+/vLfBazq0/DJ9vLw7fj4ECP0CBH6DAD1DgByjwAxT4AQr8AAV+gAI/QIEfoMAPUOAHKPADFPgBCvwABX6AAj9AgR+gwA9Q4Aco8AMU+AEK/AAFfoACP0CBH6DAD1DgByjwAxT4AQr8AAV+gAI/QIEfoMAPUOAHKPADFPgBCvwABX6AAj9AgR+gwA9Q4Aco8AMU+AEK/ADFJzISyHm0NBmIAAAAAElFTkSuQmCC" alt="" />

哈占3个字节,哈哈就是6个,ha1各占一个,符合UTF-8的编码

不同的编码之间如果不存在兼容关系,肯定是不能互相转换的,如GBK编码的文字不能用UTF-8显示,但ISO编码的字母能用UTF-8或GB2312/GBK显示,因为UTF跟GB2312/GBK是兼容IS0编码的.

但是如果GBK编码的文字通过UTF编码转回GBK呢?

下面做测试

     String str="哈哈123";
byte utfByte[]=str.getBytes("UTF-8");
byte gbkByte[]=str.getBytes("GBK");
byte isoByte[]=str.getBytes("ISO-8859-1");
//UTF->GBK->UTF
String str11=new String(utfByte,"GBK");
String str12=new String(str11.getBytes("GBK"),"UTF-8");
System.out.println(str12);
//UTF->ISO->UTF
String str21=new String(utfByte,"ISO-8859-1");
String str22=new String(str21.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(str22);
//GBK->UTF->GBK
String str31=new String(gbkByte,"UTF-8");
String str32=new String(str31.getBytes("UTF-8"),"GBK");
System.out.println(str32);
//GBK->ISO->GBK
String str41=new String(gbkByte,"ISO8859-1");
String str42=new String(str41.getBytes("ISO8859-1"),"GBK");
System.out.println(str42);

结果

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJoAAABaCAIAAADPddj0AAAEpUlEQVR4nO2by5WkMAxFiYuAHI9DmCiIojNg1ZsJYbaeBeCv/Fc1bp13Ty+qjcCSX1l2IdiMMd9//9m/r68v8/Ocet92fX6yi0N19XCoLUYdLF4El+r0qspmRuQ89c4S3QydPgwO3KFGAs36Fl8Ocg76ADkTDy9XvDx0u+JaHt+ueA51Nx1q2/Whd5tpnjNuexf+obZd6/Do07uX81p8MHHKtAc6cnsqJ9FR6F3qW/5yvpxxjIGX7p/YLKAq53N24Jn/7Ys9sq6ES8RzhSvY60hgbuX0jz4RqKeHQyUn53xwpvc/SQgNS2I0/lRHxFQcmJ1UjP5RO1LEUDiKcroZGeG5m+wZdn0m8fijQH2OZqcbr/z8rPoQ5bFcWsvGaE8L4yCCvVr9qw8m2yTGdHxIM0fz7AzODIeSGCZWOU+9E2m55kNFzqHZWVrqrgu6hNgiZxhNGuPdofteZ8wsA2tndKUop6WZ0MzK6bV5XlR98Bv9YZhZO6mOTq3jYWmU0/ODjvEaA6VslsqZPYztbJ/vdnZx5k22roNdKXvhmg/hrkUz7Wypjlw/wdentBWKf4BmYkxUy5ndDMoJxhj73dMO5PxRkknJDOQUBeQURVbOP+AXgtkpinE5t23r6KbHGAwDOUVRl9O/Rek3GkqkLmPATpOcuQ8mEanLGLDTLSc5I8eMATt9clqRoqRKTsqqsaFqSxfuzmR4yLtlqXkGQBYjybZ0uR7j+8b7oSLNvNvwRAnanvvhZ8V+JW/KeZPI6XPqnbzBCTlJRtbOlDHjm5Kch4qTqnvKaCRc6XT/UKluhdqNb3JyFh/74H4ETggL7GwpOcOnB0jSiQv67wo1KdRlTG2FyFzqP+FAPcYGhuSsL4dtxvFzcZeE3tMbF/STdJiaFAvMTsAHCmSigJyigJyiQL1TFJBTFChfiwLla1EscJMP8IHytShQvhYFyteiQPlaFChfi2KBnS3K13wsUCBD+ZoPlK9FscDsBHygQCYKyCkKyCmKVjkn17zCpmlyMX7FjUk+eGXTKWfLzrZ962uK41g+9KIbkywh59Z8Z6DLXd84GvqcQq+7McnLcuZCLUyLpr4zV2gR7EU35nlTTjLI3paSB8X86R9dwQ0W3p+dNqTGaVGmHFsu2kXcmC+55648z0d2tqRxQaT2jl53g6XkvpCcvitkY/pvodF4uxtDzac13Zgsub8pZxRVOo6NaaqQDCOD3OkruHEzV3Jfa3b6Y9o+A8pZrmkQl3FjsuS+lpxpY8642pi2l7PcIm5MltyXkNP//ha+y12DW2gnDy3ixmTJfQk57YfyMvNpOd91g6Xk/r6c7oRMUqo6mptquZRYjnkRN8ZYSE4wD+QUBeQUxYpydvn0uQCAD+QURfdNPttoirvEFmPATpOcuQ+G+sHQbgzY6Zaz8NO+1xiw0yenFSlKquSkrBobvH3NzUiyLV2uxxhvX7Pzppw3ePuaj5G1M2XM+AZvX/PR/UOluhVqN77B29d8LLCzxdvXfMwWyMiWPmO8fc3HiJz15bDNGG9fs7PA7AR8oEAmCsgpCsgpCsgpCsgpCsgpCsgpCsgpCsgpCsgpiv9RUZuNbimRYgAAAABJRU5ErkJggg==" alt="" />

结论:

UTF-8编码可以用GB2312/GBK和ISO8859-1解码后编回去

GB2312/GBK编码后只能用ISO8859-1解码后编回去

各种编码之间的关系以及getBytes的使用的更多相关文章

  1. 位(bit)、字节(byte)、字符、编码之间的关系

    1.位: 数据存储的最小单位.每个二进制数字0或者1就是1个位: 2.字节: 8个位构成一个字节:即:1 byte (字节)= 8 bit(位): 1 KB = 1024 B(字节): 1 MB = ...

  2. 基础:位(bit)、字节(byte)、字符、编码之间的关系

    1.位: 数据存储的最小单位.每个二进制数字0或者1就是1个位: 2.字节: 8个位构成一个字节:即:1 byte (字节)= 8 bit(位): 1 KB = 1024 B(字节): 1 MB = ...

  3. python中,ascii,unicode,utf8,gbk之间的关系梳理

    在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人 ...

  4. mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决

    ※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样)SHOW VARIABLES; //查看系统变量//查询字符编码相关的系统变量SHOW VARIABLES WHERE var ...

  5. 字符编码:Unicode和UTF-8之间的关系

    Unicode和UTF-8之间的关系 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256 ...

  6. UNICODE与UTF8和GBK之间的关系

    http://wenku.baidu.com/link?url=bheGEzfSjEx-QX-ciME5oKooKYE08_NJZ02l2kKFa7kVZJ4t8Ks2uSNByovgP2QL6btq ...

  7. ASCII、ANSI、GB2312、Unicode、UTF-8之间的关系

    1.ASCII码: ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统.它主要用于 ...

  8. 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?

    转自:  http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不 ...

  9. Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系

    1.Lambda表达式与接口之间的关系 只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口.见如下代码 Thread t1 = new Thread(new Runnable() ...

随机推荐

  1. 在MVC中添加异常增加日志

    MVC的结构非常棒,基本你能想到注入的地方都可以找到地方,譬如IActionFilter,IResultFilter,IAuthorizationFilter以及IExceptionFilter 以下 ...

  2. ios7学习之路七(隐藏虚拟键盘,解决键盘挡住UITextField问题)

    再正式开始之前,先来介绍一下IOS的键盘类型: 一.键盘风格 UIKit框架支持8种风格键盘 typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 ...

  3. 【NET】Winform分页控件初探

    public partial class WinFormPager : UserControl { ; /// <summary> /// 当前页 /// </summary> ...

  4. ORA-12520错误解决方法

    ORA-12520监听程序无法为请求的服务器类型找到可用的处理程序 以下不知道是不是解决方法的方法,因为我只重启下oracle服务就好了,并没进行任何修改 引用别人的文章: 1)数据库是专用服务器,但 ...

  5. CC.NET-自动化发布时 Web.config 文件维护

    [Hello CC.NET]自动化发布时 Web.config 文件维护   在 <[Hello CC.NET]CC.NET 实现自动化集成> 的 HellowWorld 中经实现: 1. ...

  6. 通过jquery来实现文本框和下拉框动态添加效果,能根据自己的需求来自定义最多允许添加数量,实用的jquery动态添加文本框特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 解析JSON、扩展Fiddler

    解析JSON.扩展Fiddler 按文章结构,这部分应该给出WCFRest项目示例,我想WinForm示例足够详尽了,况且WCFRest还不需要使用插件AppDomain那一套,于是把最近写的Fidd ...

  8. 创建基本的2D场景(part2)

    让我们继续来学习Unity2D游戏场景的制作,本文分为以下3个部分: · 添加角色和控制 . 添加2D物理阻挡 · 添加2D效果 通过制作一个移动帽子接保龄球的小游戏,我们可以学习到任何创建游戏对象, ...

  9. iOS开发-OC语言 (一)oc数据类型

    分享一套以前学习iOS开发时学习整理的资料,后面整套持续更新: oc数据类型 数据类型:基本数据类型.指针数据类型 基本数据类型:数值型.字符型(char).布尔型.空类型(void) 指针数据类型: ...

  10. 字典(Tire树)

    4189 字典  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master     题目描述 Description 最经,skyzhong得到了一本好厉害的字典,这个 ...