UTF-16 使用二或四个字节(1个或2个char)为每个字符编码,其中大部分汉字采用两个字节编码,少量不常用汉字(或字符)采用四个字节编码
由于 Java 采用的是 16 位的 Unicode 字符集,即 UTF-16,所以在 Java 中 char 数据类型是定长的,其长度永远只有 16 位,char 数据类型永远只能表示代码点在 U+0000 ~ U+FFFF 之间的字符,也就是在 BMP 内的字符。如果代码点超过了这个范围,即使用了增补字符,那么 char 数据类型将无法支持,因为增补字符需要 32 位的长度来存储,我们只能转而使用 String 来存储这个字符。


如上编写的代码,使用 char 数据类型来保存辅助平面的字符,编译器将会报错 Invalid character constant。因为那个特殊字符要用两个char来存放 若用字符串s存储 他的s.length()是2
https://zhuanlan.zhihu.com/p/23654187?refer=dreawer


首先,Java中的一个char是2个字节。java采用unicode,2个字节来表示一个字符,这点与C语言中不同,c语言中采用ASCII,在大多数系统中,一个char通常占1个字节,但是在0~127整数之间的字符映射,unicode向下兼容ASCII。而Java采用unicode来表示字符,一个中文或英文字符的unicode编码都占2个字节,但如果采用其他编码方式,一个字符占用的字节数则各不相同。在 GB 2312 编码或 GBK 编码中,一个英文字母字符存储需要1个字节,一个汉字字符存储需要2个字节。 在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。在UTF-16编码中,一个英文字母字符存储需要2个字节,一个汉字字符储存需要2或4个字节(Unicode扩展区的一些汉字存储需要4个字节)。在UTF-32编码中,世界上任何字符的存储都需要4个字节。在测试的时候String str = "1";  int byte_len = str.getBytes("utf-16").length;
结果是4
但String str = "12";  int byte_len = str.getBytes("utf-16").length;
结果是6
所以不管中文还是英文 utf-16getbytes() 都是2*n+2 因为UTF16时它默认加了两个字节的前缀来区分大小端我的系统的默认编码方式为GBK,因此对于字符串 “你好hello” getbytes是9 length是7http://blog.csdn.net/ns_code/article/details/14162087
Unicode 是容纳世界所有文字符号的国标标准编码,java中使用2个字节 为每个字符编码。UTF 是英文 Unicode Transformation Format 的缩写,意为把 Unicode 字符转换为某种格式。UTF 系列编码方案(UTF-8、UTF-16、UTF-32)均是由 Unicode 编码方案衍变而来,以适应不同的数据存储或传递,它们都可以完全表示 Unicode 标准中的所有字符。目前,这些衍变方案中 UTF-8 被广泛使用,而 UTF-16 和 UTF-32 则很少被使用。UTF-8 使用**一至四个字节**为每个字符编码,其中大部分汉字采用三个字节编码,少量不常用汉字(或符号)采用四个字节编码。因为 UTF-8 是可变长度的编码方式,相对于 Unicode 编码可以减少存储占用的空间,所以被广泛使用


Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。

字母A用ASCII编码是十进制的65,二进制的01000001;

字符0用ASCII编码是十进制的48,二进制的00110000,注意字符’0’和整数0是不同的;

汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。

你可以猜测,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。

新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:

从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:


=============很久以前保存的,别人写的但是很明了=============很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为”字节“。再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为”计算机“。开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。
他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上0×10,
终端就换行,遇上0×07, 终端就向人们嘟嘟叫,例好遇上0x1b,
打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0×20以下的字节状态称为”控制码”。他们又把所有的空
格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。大家看到这样,都感觉
很好,于是大家都把这个方案叫做 ANSI 的”Ascii”编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机
保存他们的文字,他们决定采用
127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128
到255这一页的字符集被称”扩展字符集“。从此之后,贪婪的人类再没有新的状态可以用了,美帝国主义可能没有想到还有第三世界国家的人们也希望可以用到计算机吧!等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客气
地把那些127号之后的奇异符号们直接取消掉,
规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到
0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的
字母、日文的假名们都编进去了,连在 ASCII
里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。
中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把
GB2312 没有用到的码位找出来老实不客气地用上。
后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字
符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。 中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 “DBCS“(Double
Byte Charecter Set
双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处
理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。那时候凡是受过加持,会编程的计算机僧侣
们都要每天念下面这个咒语数百遍: “一个汉字算两个英文字符!一个汉字算两个英文字符……”因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海
里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS
编码方案——当时的中国人想让电脑显示汉字,就必须装上一个”汉字系统”,专门用来处理汉字的显示、输入的问题,但是那个台湾的愚昧封建人士写的算命程序
就必须加装另一套支持 BIG5
编码的什么”倚天汉字系统”才可以用,装错了字符系统,显示就会乱了套!这怎么办?而且世界民族之林中还有那些一时用不上电脑的穷苦人民,他们的文字又怎
么办? 真是计算机的巴比伦塔命题啊!正在这时,大天使加百列及时出现了——一个叫 ISO
(国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号
的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。
unicode开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO
就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原
来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在
保存英文文本时会多浪费一倍的空间。这时候,从旧社会里走过来的程序员开始发现一个奇怪的现象:他们的strlen函数靠不住了,一个汉字不再是相当于两个字符了,而是一个!是的,从unicode开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符“!同时,也都是统一的”两个字节“,请注意”字符”和”字节”两个术语的不同,“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号。在unicode中,一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。unicode同样也不完美,这里就有两个的问题,一个是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是
分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每
个英文字母前都必然有二到三个字节是0,这对于存储空间来说是极大的浪费,文本文件的大小会因此大出二三倍,这是难以接受的。unicode在很长一段时间内无法推广,直到互联网的出现,为解决unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII
码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中
文字符占3个字节)。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。Unicode符号范围 | UTF-8编码方式(十六进制) | (二进制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-16 UTF-8相关推荐

  1. 尚硅谷python入门

    一.计算机基础 计算机是什么 计算机就是用来计算的机器 目前来讲,计算机只能根据人类的指令来完成各种操作,人让它干嘛它就得干嘛. 学习计算机就是学习如何控制计算机 计算机的组成 硬件:键盘.鼠标.显示 ...

  2. 数据库之十二星座 白羊座

    接上回书,双子座MYSQL,未待续完........ 本回的讲讲 SQL SERVER --- 白羊座 说起SQL SERVER 基本上大部分DBA 都是这个表情,切,我也想的到大部分人就是这个表情. ...

  3. 代码点与代码单元和Unicode相关的UTF

    java字符串由char序列组成,char数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元,大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元来表 ...

  4. UTF、Unicode、ASCII及中文编码

    一.Unicode缘起 Unicode是一种字符编码规范 . 1.国际标准ASCII编码 先从ASCII说起.ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits)  ...

  5. Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码

    将字符转换为二进制码的过程,我们称为编码,将二进制码转换为字符的过程,我们称为解码. 编码和解码时所采用的规则,我们称为字符集 常见的字符集: ASCII - 美国人编码,使用7位来对美国常用的字符进 ...

  6. DOS、Mac 和 Unix 文件格式+ UltraEdit使用

    文件格式 区分DOS.Mac 和 Unix分别对应三种系统 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种 文件模式 区分ASCII模式和Binary模式  通常由系统决定,大多数 ...

  7. JNI 实战全面解析

     项目决定移植一款C++开源项目到Android平台,开始对JNI深入研究. JNI是什么? JNI(Java Native Interface)意为JAVA本地调用,它允许Java代码和其他语言 ...

  8. java utf-8文件处理bom头

    参考:http://www.cnblogs.com/wanglao/p/5337836.html http://akini.mbnet.fi/java/unicodereader/UnicodeRea ...

  9. 关于计算机编码的笔记

    一直对于字符编码不是很清晰,今天各种百度百科刷一下,最后看到一篇文章: https://www.zhihu.com/question/23374078 写的实在太好了,以上总结就是 ASCII =&g ...

  10. 计算机java语言答案_【计算机二级Java语言】卷019

    选择题 公共知识 [1]下列叙述中正确的是 [A]算法的时间复杂度与计算机的运行速度有关 [B]算法的时间复杂度与运行算法时特定的输入有关 [C]算法的时间复杂度与算法程序中的语句条数成正比 [D]算 ...

最新文章

  1. 51 jQuery插件库
  2. oracle中生成大批量数据的方法-下
  3. box-shadow比较美观的阴影
  4. MATLAB 中怎么求图像在水平方向和垂直方向的像素和,用图表示
  5. 3DSlicer14:Loadable Module
  6. 【javascript 对日期的扩展 Format\addDays】
  7. 浏览器登录_经常用浏览器自动登录忘记了密码?教你一键查看网页星号密码
  8. flask-limiter限制单个IP访问的频率和次数
  9. 摩拜服务器维护,摩拜的后台是云服务器
  10. Office2010安装相关问题及解决方法
  11. vue项目运用繁体字
  12. java 时间格式化 注解_Java关于时间格式化的方法
  13. 支持向量回归(多核函数)
  14. Linux 远程拷贝命令
  15. 【matlab】数值计算实现电路仿真
  16. 开发商给埋的五类网线,家中想改为千兆网络怎么办好?
  17. 互动课件制作 html,如何实现多图版互动式图片课件的制作
  18. 软件测试常用的性能测试指标,7个常用的网络性能测试指标
  19. 前端JS校验银行卡卡号和身份证号码(附ES6版方法)
  20. CLEARCO Silicone Fluids Grease Compounds

热门文章

  1. redhat系列镜像下载
  2. QQ消息群发器实现原理及核心代码
  3. 打造100%绝对安全的个人电脑
  4. 一文读懂数字治理的要素与灵魂
  5. 工欲善其事必先利其器——Elasticsearch安装
  6. spring boot工作计划管理软件 毕业设计-附源码181638
  7. 图片上传到七牛云存储空间
  8. 【开源】硬件/软件i2c两种方式移植u8g2单色图形库驱动0.96吋OLED
  9. 赋能云会议渠道,开会宝 vymeet发布“梧桐计划”,培养未来的合作伙伴
  10. java代码实现在Windows中自动连接WiFi(乞丐版)