character是什么意思(character用法)
为什么String要设计成final,如何设计一个不可变的类?“留下了一个与编码相关的问题。在Java中,理论上说一个字符(汉字字母)占用两个字节。但在UTF-8,新字符串(“字”)。getBytes()。对于3个字节,长度返回3。你知道为什么吗?Java中char占多少字节?
在回答这个问题之前,我们先来学习一些基础知识。
什么是字符集?什么是编码?
文字是文字和符号的总称,包括文字、图形符号、数学符号等。抽象字符的字符集是一个字符集。
之所以说“抽象”二字,是因为这里所说的文字是没有任何具体形式的文字。比如文章中看到的“韩”这个人物,其实就是这个人物的具体表现,也是这个人物的形象表现。人们在读“汉”字时,用的是另一种具体表现形式——声音。但无论如何,这两种表现形式都是指这个汉字,同一个字可能有无数种表现形式(点阵法、矢量法、音频等。),而且每种表现形式中相同的字符都会被包含在字符集中,这样会使集合过大。所以抽象字符集中的所有字符都是指唯一存在的抽象字符,而忽略了它的具体表现形式。给定抽象字符集中的每个字符被赋予一个整数后,字符集就会有一个顺序,成为一个编码字符集。同时,这个数字可以唯一确定它所指的是哪个字符。对于同一个字符,不同的字符集编码系统指定不同的整数。例如,单词“Er”在Unicode中编号为0x513F,这意味着它是Unicode中的0X513F字符。在另一个编码字符集中,这个字是0xA449。
编码字符集指的是这一组分配了整数的字符,但分配给编码字符集中字符的整数不一定是字符存储在计算机中时使用的值。用什么二进制整数值来表示存储在计算机中的字符,是由字符集编码决定的。
字符集编码决定了如何将字符的整数映射到二进制整数值。在几乎所有英文字符的字符集编码中,英文字母的整数与存储在计算机中的二进制形式是一致的。然而,在一些编码方法中,如Unicode字符集的UTF-8编码,很大一部分字符的整数被转换并存储在计算机中。例如,“中文”的Unicode值为0x6C49,但其编码格式为UTF-8格式,值为0xE6B189 (3字节)。
编码字符集中的每个字符对应一个唯一的代码值。这些码值称为码点,可以看作是字符在编码字符集中的序号。给定编码方式下字符的二进制位序列称为代码单元。
注意:我们在这里介绍了两个概念,代码点和代码元素。
为什么要区分字符集和编码?
在早期,字符集和编码是一对一的。有许多字符编码方案。一个字符集只有一个编码实现,它们之间是一一对应的。比如GB2312,在这种情况下,不管你怎么称呼它们,比如“GB2312编码”和“GB2312字符集”,其实都是一回事,也许它并没有做什么特别的区分,所以无论如何都不会错。
说到Unicode,就不一样了。唯一的Unicode字符集对应三种编码:UTF-8、UTF-16和UTF-32。字符集和编码的概念是完全分离和模块化的,这在Unicode时代其实是被广泛认可的。
1)charset是character set的缩写,即字符集。
2)编码是charset编码的缩写,即字符集编码。
从上图可以清楚地看出,
1.编码依赖于字符集,就像代码中的接口实现依赖于接口;
2.一个字符集可以有多个代码实现,就像一个接口可以有多个实现类一样。
Unicode为什么这么特别?
要想出新的字符集标准,旧的字符集字符不够。
Unicode的目标是统一所有字符集,包含所有字符,所以不需要调整任何新的字符集。
但是如果你觉得它现有的编码方案不是很好呢?当一个新的字符集无法创建时,我们只能在编码上做文章,于是有了很多实现,传统的一一对应被打破。
从上图可以看出,由于历史原因,你也会看到Unicode和UTF-8在很多地方混在一起的情况。在这种情况下,Unicode通常是UTF-16或更早的UCS-2编码。
现在我们已经谈了很多关于Unicode的内容。由于种种原因,我们必须承认“Unicode”这个词在不同的上下文中有不同的含义。它可以指:
1)Unicode标准
2)Unicode字符集
3)3)Unicode的抽象编码(数字),即码位。
4)4)Unicode的具体编码实现,通常是长度可变的UTF-16,或者更早的16位固定长度的UCS-2。
这里着重介绍UTF-16编码。UTF-16将Unicode字符集的码点映射到一个16位整数序列(即长度为2个字节的符号)中,用于数据存储或传输。Unicode字符的码点需要一个或两个16位符号来表示,所以这是一个可变长度的表示。
UTF-16可以看作是UCS-2的父集。UTF-16和UCS-2在没有辅助平面字符之前指的是同一个意思(基本思路是用两个16位代码代表一个字符,只针对65535以上的字符)。引入辅助平面字符后,称为UTF-16。
现在如果有软件宣称支持UCS-2编码,实际上是暗示不能支持UTF-16中超过2字节的词集。对于小于0x10000的UCS代码,UTF-16编码等同于UCS代码。
为什么要重点关注UTF-16编码?因为Java的内部代码使用的是UTF-16编码,也就是我们常说的Unicode编码。
没想到会这么久。我只是介绍了字符集和编码的区别。看来我得分两篇来回答上一篇留下的问题了。这篇文章的总结其实就是两句话:
编码字符集中每个字符的指定顺序称为码位,该字符在编码字符集中的序号,以及给定编码方式的二进制序列称为码单元。
在Java的世界里,我们接触到的更多的是外部代码,也就是程序与外界交互时对外使用的字符编码,但还有更多你不知道的。期待下次我们正式进入Java的编码世界,最后回答前面的问题。
Jav深圳生活网一个挖掘序列文章
你真的懂Java里的String吗?
为什么String要设计成final,如何设计不可变类?
免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!
-
江淮iEV7试驾预约流程如下:首先,访问江淮汽车官网或关注官方公众号,进入“试驾预约”页面。填写个人信息,...浏览全文>>
-
试驾MG4 EV全攻略:MG4 EV是一款主打年轻科技感的纯电紧凑型车,外观时尚,内饰简洁。试驾时重点关注其动力...浏览全文>>
-
预约试驾奥迪SQ5 Sportback,线上+线下操作指南如下:线上预约:访问奥迪官网或官方App,选择“试驾预约”,...浏览全文>>
-
试驾别克君越,一键启动,开启豪华驾驶之旅。作为一款中大型轿车,君越以优雅外观、舒适空间和强劲动力赢得广...浏览全文>>
-
试驾沃尔沃XC40时,需注意以下几点:首先,提前预约试驾时间,确保车辆状态良好。其次,熟悉车辆智能安全系统...浏览全文>>
-
预约宝马X1试驾前,建议提前通过官网或电话联系4S店,确认车型库存与试驾时间。到店后,先与销售顾问沟通需求...浏览全文>>
-
比亚迪海豹05 DM-i试驾预约流程如下:首先,访问比亚迪官网或关注官方公众号,进入“试驾预约”页面。填写个...浏览全文>>
-
试驾奇骏时,建议关注以下几点:首先,提前预约专业试驾路线,熟悉车辆性能;其次,注意检查车辆外观及内饰是...浏览全文>>
-
凯迪拉克CT5预约试驾,从线上到线下,体验顺畅而专业。只需几步简单操作,即可在官网或App上选择心仪门店与时...浏览全文>>
-
预约东风富康试驾可通过以下步骤进行:1 官网或官方App:访问东风富康官网或下载其官方App,进入“试驾预约...浏览全文>>
- 比亚迪海豹05DM-i试驾预约流程
- 云度新能源预约试驾有哪些途径
- 阿维塔07试驾预约,体验极致驾驶乐趣
- 宾利试驾,快速操作,轻松体验驾驶乐趣
- 全顺试驾预约,一键搞定,开启豪华驾驶之旅
- QQ多米试驾预约,轻松搞定试驾
- 零跑C10试驾的流程是什么
- 宝马X1预约试驾,4S店体验全攻略
- 试驾QQ多米,畅享豪华驾乘,体验卓越性能
- 江铃集团新能源试驾预约,一键搞定,开启豪华驾驶之旅
- 试驾雷克萨斯ES如何快速锁定试驾名额?
- 兰博基尼试驾预约有哪些途径
- 试驾五菱凯捷有哪些途径
- 力帆预约试驾,一键搞定,开启豪华驾驶之旅
- 极石汽车试驾预约,4S店体验全攻略
- 本田雅阁试驾,新手试驾注意事项
- 捷途旅行者试驾预约预约流程
- 昊铂试驾预约,快速通道开启豪华体验
- 五菱预约试驾,开启完美驾驭之旅
- 试驾捷豹E-PACE,4S店体验全攻略