Java 编码 字符集

@author ixenos

  1. 1.   字符集

a)    字符集建立了两字节Unicode码元序列与使用本地字符编码方式的字节序列之间的映射

b)    为了兼容其它命名,每个字符集都有许多别名,Charset对象的aliases方法可以返回由别名构成的Set对象

i.          Set<String> aliases = charset.aliases();

ii.          for(String alias : aliases){…}

iii.          可以使用别名获得Charset对象:Charset charset =Class.forName(“UTF-8”)

c)

 作者:Jim Liu
链接:https://www.zhihu.com/question/50356029/answer/120608944
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

TL;DR
字符集:收录了若干字符,并且对它们编号索引。
字符编码:将一种字符集当中的编号索引,使用计算机能处理的技术要求和格式(通常是以字节为最小单位)做二进制实现。
----分割线----
GB2312是字符集,也是字符编码,收录量大约几千个字符。
GB18030是字符集,也是字符编码,是对GB2312的一个巨大扩展,收录量大约7万多字符。
以上两个是国标
GBK是微软对GB2312的扩展,兼容GB2312(而GB18030不完美兼容GBK),GBK不是国标。
----分割线----
Unicode是“万国码”字符集,同时它也是一种很朴素的编码,但少有程序会直接用这种编码。
更多程序会使用Unicode Transform Format/UTF编码,比较常见的是UTF-8UTF-16

----分割线----
为什么不支持Unicode而造GB18030?
1、Unicode是全世界用的,受到ISO等制约,并且非常向英语妥协。它不见得是对中文字符最完美的编码方案。打个比方,UTF-8编码方式大多数中文字符需要3字节,而GB18030编码方式大多数中文字符只需要2字节。
2、GB18030是完美兼容GB2312的,这对于中文环境下的遗留系统兼容是非常好的特性。根据维基百科显示,Unicode在1992年才收录中文字符,1993年的Unicode 1.1版本中文收录量是和GB18030差不多的,而GB2312早在80年代就开始普及。并不是我们不兼容Unicode,而是Unicode不兼容我们。对于GB18030而言,他承担了扩展GB2312的作用,不是简单的造轮子搞标准分化能解释的。Windows在1995年推出了GBK,它是完美兼容GB2312的。在那个年代,互联网还不像今天这么发达,根据不同语言环境选择性价比高的编码方案,还是可以理解的。

d)  本地编码方式模式 不能表示所有的Unicode字符,如果某个字符不能显示,将被转化成“?”

e)  一旦有了字符集,就可以在(Unicode码元的)Java字符串
(编码组成的)字节序列之间进行转换

i.     
编码(动词 encode)Java字符串示例,即转换成byte数组,对应的一个或两个或三个或四个字节代表字符编码(名词)

ii.     
String str =”…”;

iii.     
ByteBuffer buffer = charset.encode(str)
;//使用对应字符集对字符串进行编码,返回ByteBuffer对象

iv.     
byte[] bytes = buffer.array(); //取出该对象中的字节数组

v.     
而要想解码字节序列,自然就需要一个字节缓冲区(ByteBuffer)对象,使用ByteBuffer的静态方法wrap可以将一个字节数组转化成一个ByteBuffer对象的缓冲区

vi.     
byte[] bytes = …;

vii.     
ByteBuffer bbuf = ByteBuffer.wrap(bytes,
offset, length);

viii.     
CharBuffer cbuf = charset.decode(bbuf);//返回CharBuffer对象

ix.     
String str = cbuf.toString();


 扩展阅读

GB18030 根上跟 Unicode 有关系吗?

编码歪传——基础篇

编码歪传——Web篇

编码歪传——番外篇

Java 编码 字符集的更多相关文章

  1. java中文乱码解决之道(四)-----java编码转换过程

    前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的.但是了解这些仅仅只是一个开始,以下博客将侧重介绍java乱码是如何 ...

  2. 【JAVA编码专题】总结

    第一部分:编码基础 为什么需要编码:用计算机看得懂的语言(二进制数)表示各种各样的字符. 一.基本概念 ASCII.Unicode.big5.GBK等为字符集,它们只定义了这个字符集内有哪些字符,以及 ...

  3. 【JAVA编码专题】深入分析 Java 中的中文编码问题

    http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ 几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么 ...

  4. java中文乱码解决之道(四)—–java编码转换过程

    原文出处:http://cmsblogs.com/?p=1475 前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的. ...

  5. java编码问题

    工作中经常遇到java编码问题,由于缺乏研究,总是无法给出确切的答案,这个周末在网上查了一些资料,在此做些汇总. 问题一:在java中读取文件时应该采用什么编码? Java读取文件的方式总体可以分为两 ...

  6. Java编码问题汇总

    转自 http://www.blogjava.net/zhangchao/archive/2011/05/26/351051.html Thanks Java编码问题汇总 工作中经常遇到java编码问 ...

  7. java编码与解码(一)

    转:https://blog.csdn.net/heyanxi0101/article/details/80356870 java编码与解码(一) 编码表概述和常见的编码表 概述:有字符及其对应的数值 ...

  8. java编码,乱码问题详解

    一.常见的编码格式 1.ASCII 基础编码,英文和西欧字符. 用一个字节的低7位表示,一共128个. 0~13是控制字符如换行.回车.删除等,32~126是打印字符,键盘输入. 2.IOS-8859 ...

  9. 【JAVA编码专题】总结 分类: B1_JAVA 2015-02-11 15:11 290人阅读 评论(0) 收藏

    第一部分:编码基础 为什么需要编码:用计算机看得懂的语言(二进制数)表示各种各样的字符. 一.基本概念 ASCII.Unicode.big5.GBK等为字符集,它们只定义了这个字符集内有哪些字符,以及 ...

随机推荐

  1. YARN的capacity调度器主要配置分析

    yarn中一个基本的调度单元是队列. yarn的内置调度器: 1.FIFO先进先出,一个的简单调度器,适合低负载集群.2.Capacity调度器,给不同队列(即用户或用户组)分配一个预期最小容量,在每 ...

  2. Maven之(三)Maven插件

    Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,像编译是通过maven-compile-plugin实现的.测试是通过maven-surefire-p ...

  3. 负载均衡,最理想使用 redis实现session共享

    负载均衡在多台php服务器负载均衡的情况下,第一秒请求是a服务器,第二秒请求是b服务器, session必须放在一个公共的服务器,最理想是使用 redis实现session共享.内存的速度比磁盘访问快 ...

  4. SELinux开启和关闭

    1.查看SELinux状态 /usr/sbin/sestatus -v 2.关闭SELinux (1)临时关闭(不用重启机器): setenforce 0 #设置SELinux成为permissive ...

  5. xml-DTD相关

    DTD约束既可以作为一个单独的文件,也可以在XML文件内编写. 在XML文件内编写DTD:

  6. 目标检测中proposal的意义

    在目标检测中,从很早就有候选区域的说法,也是在2008年可能就有人使用这个方法,在2014年的卷积神经网络解决目标检测问题的文章中,这个候选框方法大放异彩,先前的目标检测方法主要集中在使用滑动窗口的方 ...

  7. css3 box-reflect 倒影效果

    语法: box-reflect:包括3个值. 1. direction 定义方向,取值包括 above . below . left . right. above: 指定倒影在对象的上边 below: ...

  8. Android开源库loopj的android-async-http的 JsonHttpResponseHandler 存在死循环GC_CONCURRENT

    我现在用的是 AndroidAsyncHttp 1.4.4 版本,之前遇到一个很奇怪的问题, 当使用 JsonHttpResponseHandler 解析请求的页面出现服务器错误或其他情况返回的内容不 ...

  9. Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)

    Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...

  10. HUD 1171 Big Event in HDU(01背包)

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...