贵州做网站公司
贵州做网站公司~专业!靠谱!
10年网站模板开发经验,熟悉国内外开源网站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等网站程序,可为您提供网站建设,网站克隆,仿站,网页设计,网站制作,网站推广优化等服务。我们专注高端营销型网站,企业官网,集团官网,自适应网站,手机网站,网络营销,网站优化,网站服务器环境搭建以及托管运维等。为客户提供一站式网站解决方案!!!

java中为什么'a'转成int类型是97

来源:网络转载 时间:2024-01-29 08:28:57
int i = 'a’;//i=97

为什么'a'对应的十进制是97

计算机是以二进制的形式来存储数据的,它只认识 0 和 1 两个数字,我们在屏幕上看到的文字,在存储之前都被转换成了二进制(0和1序列)(编码),在显示时也要根据二进制找到对应的字符。(解码)

字符集定义了文字和二进制的对应关系,为字符分配了唯一的编码

如ASCII字符集定义的'a'对应的编码是01100001

什么是字符集

字符集规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。

什么是字符编码

字符集只是一个规则集合的名字,对应到真实生活中,字符集就是对某种语言的称呼。例如:英语,汉语。

对于一个字符集来说要正确编码转码一个字符需要三个关键元素:字库表(character repertoire)、编码字符集(coded character set)、字符编码(character encoding form)。

  • 字库表装着所有字符
  • 编码字符集:即用一个 序号(code point) 来表示 一个字符在字库中的位置。
  • 字符编码:编码字符集 和 实际存储数值 之间的转换关系。一般来说都会直接将code point的值转为二进制直接存储。例如在ASCII中A在表中排第65位,而编码后A的数值是0100 0001也即十进制的65的二进制转换结果。

ASCII字符集

计算机是美国人发明的,他们首先要考虑的问题是,如何将二进制和英文字母对应起来。

当时,各个厂家或者公司都有自己的做法,编码规则并不统一,这给不同计算机之间的数据交换带来不小的麻烦。但是相对来说,能够得到普遍认可的有 IBM 发明的 EBCDIC 和此处要谈的 ASCII。

ASCII 是“American Standard Code for Information Interchange”的缩写,翻译过来是“美国信息交换标准代码”。看这个名字就知道,这套编码是美国人给自己设计的,他们并没有考虑欧洲那些扩展的拉丁字母,也没有考虑韩语和日语,我大中华几万个汉字更是不可能被重视。

ASCII 的标准版本于 1967 年第一次发布,最后一次更新则是在 1986 年,迄今为止共收录了 128 个字符,包含了基本的拉丁字母(英文字母)、阿拉伯数字(也就是 1234567890)、标点符号(,.!等)、特殊符号(@#$%^&等)以及一些具有控制功能的字符(往往不会显示出来)。

在 ASCII 编码中,大写字母、小写字母和阿拉伯数字都是连续分布的(见下表),这给程序设计带来了很大的方便。例如要判断一个字符是否是大写字母,就可以判断该字符的 ASCII 编码值是否在 65~90 的范围内。

字库表

<thead>
align: center">二进制十进制十六进制字符/缩写解释
00000000000NUL (NULL)空字符
00000001101SOH (Start Of Headling)标题开始
00000010202STX (Start Of Text)正文开始
00000011303ETX (End Of Text)正文结束
00000100404EOT (End Of Transmission)传输结束
00000101505ENQ (Enquiry)请求
00000110606ACK (Acknowledge)回应/响应/收到通知
00000111707BEL (Bell)响铃
00001000808BS (Backspace)退格
00001001909HT (Horizontal Tab)水平制表符
00001010100ALF/NL(Line Feed/New Line)换行键
00001011110BVT (Vertical Tab)垂直制表符
00001100120CFF/NP (Form Feed/New Page)换页键
00001101130DCR (Carriage Return)回车键
00001110140ESO (Shift Out)不用切换
00001111150FSI (Shift In)启用切换
000100001610DLE (Data Link Escape)数据链路转义
000100011711DC1/XON (Device Control 1/Transmission On)设备控制1/传输开始
000100101812DC2 (Device Control 2)设备控制2
000100111913DC3/XOFF (Device Control 3/Transmission Off)设备控制3/传输中断
000101002014DC4 (Device Control 4)设备控制4
000101012115NAK (Negative Acknowledge)无响应/非正常响应/拒绝接收
000101102216SYN (Synchronous Idle)同步空闲
000101112317ETB (End of Transmission Block)传输块结束/块传输终止
000110002418CAN (Cancel)取消
000110012519EM (End of Medium)已到介质末端/介质存储已满/介质中断
00011010261ASUB (Substitute)替补/替换
00011011271BESC (Escape)逃离/取消
00011100281CFS (File Separator)文件分割符
00011101291DGS (Group Separator)组分隔符/分组符
00011110301ERS (Record Separator)记录分离符
00011111311FUS (Unit Separator)单元分隔符
001000003220(Space)空格
001000013321!
001000103422"
001000113523#
001001003624$
001001013725%
001001103826&
001001113927'
001010004028(
001010014129)
00101010422A*
00101011432B+
00101100442C,
00101101452D-
00101110462E.
00101111472F/
0011000048300
0011000149311
0011001050322
0011001151333
0011010052344
0011010153355
0011011054366
0011011155377
0011100056388
0011100157399
00111010583A:
00111011593B;
00111100603C<
00111101613D=
00111110623E>
00111111633F?
010000006440@
010000016541A
010000106642B
010000116743C
010001006844D
010001016945E
010001107046F
010001117147G
010010007248H
010010017349I
01001010744AJ
01001011754BK
01001100764CL
01001101774DM
01001110784EN
01001111794FO
010100008050P
010100018151Q
010100108252R
010100118353S
010101008454T
010101018555U
010101108656V
010101118757W
010110008858X
010110018959Y
01011010905AZ
01011011915B[
01011100925C\
01011101935D]
01011110945E^
01011111955F_
011000009660`
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
011110111237B{
011111001247C|
011111011257D}
011111101267E~
011111111277FDEL (delete)删除

后来欧洲又在ASCII码基础上扩充有了ISO-8859-1

GB2312字符集

国人也需要将中文存储到计算机,规定了GB2312字符集,使用2个字节表示一个汉字,英文还是1个字节同上

那么存储时好存,找到字符对应字符编码存储即可,但读取时怎么知道是按一个字节读还是2个字节读

101110011111101001100001,凡是汉字,对应字符编码都以1开头,所以读取2个字节1011100111111010即国,以0开头,读取1个字节,01100001即a

GB2312 编码范围, GB2312 编码表 (qqxiuzi.cn)

分为94个区,每个区有94个数,下面以16进制表示

常见进制加减法二进制、八进制、十六进制、十进制之间的转换

GB2312编码范围:A1A1-FEFE,其中汉字编码范围:B0A1-F7FE。

如、的序号是A1A2,前两位是区号,后两位是区中的第几个数

如A1A2代表01区的第2个数

那么反过来呢?

以包为例,它在16区的第92个数,把它们转成16进制分别与A0相加

16转成十六进制是1092转成十六进制是5C  10+ A0 = B0  5C+ A0= FC即包对应的序号是B0FC,转成2进制是1011000011111100,当作字符编码存储
E5A4代表什么  E5- A0= 45  A4- A0=  445转成10进制是69,4转成10进制还是4即69区的第4个数

如果10转16进制看着不舒服

GB2312 中文简体字库表_panqihe的专栏-CSDN博客_gb2312字库表

、对应的是A1A0+2,即A1A2,比较一目了然

GBK和GB18030是后来的扩展编码

GB2312,GBK,GB18030 这几种字符集的主要区别是什么

Unicode

早期人们用 8 位二进制来编码英文字母(最前面的一位是 0),也就是说,将英文字母和一些常用的字符和这 128 中二进制 0、1 串一一对应起来,比如说 大写字母“A”所对应的二进制位“01000001”,转换为十六进制为 41。

在美国,这 128 是够了,但是其他国家不答应啊,他们的字符和英文是有出入的,比如在法语中在字母上有注音符号,如 é ,这个怎么表示成二进制?

所以各个国家就决定把字节中最前面未使用的那一个位拿来使用,原来的 128 种状态就变成了 256 种状态,比如 é 就被编码成 130(二进制的 10000010)。

为了保持与 ASCII 码的兼容性,一般最高为为 0 时和原来的 ASCII 码相同,最高位为 1 的时候,各个国家自己给后面的位 (1xxx xxxx) 赋予他们国家的字符意义。

但是这样一来又有问题出现了,不同国家对新增的 128 个数字赋予了不同的含义,比如说 130 在法语中代表了 é,但是在希伯来语中却代表了字母 Gimel(这不是希伯来字母,只是读音翻译成英文的形式)具体的希伯来字母 Gimel 看下图

所以这就成了不同国家有不同国家的编码方式,所以如果外国朋友发给你一封邮件,打开后全是???乱码,正是因为使用的解码方式与编码不一致

如下面的例子

使用UTF-8编码(一个汉字占3个字节)储存"天下"得到的二进制是11100101 10100100 10101001 11100100 10111000 10001011

使用GB2312解码,1开头的读2个字节,11100101 10100100转成16进制是E5A4,即69区的第4个数澶,剩下自己解析,即“澶╀笅”

Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的序号,这个序号一般写成 16 进制,在前面加上 U+。例如:“马”的 Unicode 是U+9A6C。

Unicode 本身只规定了每个字符的在表上的编号是多少(编码字符集),并没有规定这个编号如何存

那我可以直接把 Unicode 编号直接转换成二进制进行存储,就同ASCII和GBK一样,是的,你可以,但是这个就需要人为的规定了,而 Unicode 并没有说这样弄,因为除了你这种直接转换成二进制的方案外,还有其他方案,接下来我们会逐一看到。

编号怎么对应到二进制表示呢?有多种方案:主要有 UTF-8,UTF-16,UTF-32。

UCS-2和UCS-4是什么

1、UTF-32

先来看简单的 UTF-32,很浪费空间

这个就是字符所对应编号的整数二进制形式,四个字节。这个就是直接转换。 比如马的 Unicode 为:U+9A6C,那么直接转化为二进制,它的表示就为:00000000 00000000 10011010 01101100。

这里需要说明的是,转换成二进制后计算机存储的问题,我们知道,计算机在存储器中排列字节有两种方式:大端法和小端法,大端法就是将高位字节放到低地址处,比如16进制 0x1234, 计算机用两个字节存储,一个是高位字节 0x12,一个是低位字节 0x34,它的存储方式为下:

计算机存储的大端法和小端法

143416对应的二进制是00010100 00110100,14是高位,34是低位字节;但16位不能放在1个只能装8位的格子里,|00010100|00110100|,高位字节放在前面叫大端法

|00110100|00010100,这么放叫小端法

UTF-32 用四个字节表示,处理单元为四个字节(一次拿到四个字节进行处理),如果不分大小端的话,那么就会出现解读错误,比如我们一次要处理四个字节 12 34 56 78,这四个字节是表示 0x12 34 56 78 还是表示 0x78 56 34 12?不同的解释最终表示的值不一样。

我们可以根据他们高低字节的存储位置来判断他们所代表的含义,所以在编码方式中有 UTF-32BE 和 UTF-32LE,分别对应大端和小端,来正确地解释多个字节(这里是四个字节)的含义。

0x11是什么,0x代表16进制的11
//可是试试输出aint a = 11;//十进制a = 015;//八进制,相当于10进制的13a = 0x20;//16进制,10进制的32a = 0b11;//2进制,10进制的3

2、UTF-16

UTF-16 使用变长字节表示

① 对于编号在 U+0000 到 U+FFFF 的字符(常用字符集),直接用两个字节表示。
② 编号在 U+10000 到 U+10FFFF 之间的字符,需要用四个字节表示。

同样,UTF-16 也有字节的顺序问题(大小端),所以就有 UTF-16BE 表示大端,UTF-16LE 表示小端。

1个16进制数对应4个二进制数位,2个16进制数位对应8个二进制数位,即1个字节

892316 -> 10001001 001000112

8916 -> 100010012

2316 -> 001000112

816 -> 10002

916 -> 10012

216 -> 00102

316 -> 00112

存储a的二进制,a -> 009710 -> 006116

大端00000000 01100001

小端01100001 00000000

3、UTF-8

UTF-8 就是使用变长字节表示,顾名思义,就是使用的字节数可变,这个变化是根据 Unicode 编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多。使用的字节个数从 1 到 4 个不等。

UTF-8 的编码规则是:

对于单字节的符号,字节的第一位设为 0,后面的7位为这个符号的 Unicode 码,因此对于英文字母,UTF-8 编码和 ASCII 码是相同的。

对于n字节的符号(n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10,剩下的没有提及的二进制位,全部为这个符号的 Unicode 码 。

举个例子:比如说一个字符的 Unicode 编码是 130,显然按照 UTF-8 的规则一个字节是表示不了它(因为如果是一个字节的话前面的一位必须是 0),所以需要两个字节(n = 2)。

根据规则,第一个字节的前 2 位都设为 1,第 3(2+1) 位设为 0,则第一个字节为:110X XXXX,后面字节的前两位一律设为 10,后面只剩下一个字节,所以后面的字节为:10XX XXXX。

所以它的格式为 110XXXXX 10XXXXXX 。

下面我们来具体看看具体的 Unicode 编号范围与对应的 UTF-8 二进制格式

那么对于一个具体的 Unicode 编号,具体怎么进行 UTF-8 的编码呢?

首先找到该 Unicode 编号所在的编号范围,进而可以找到与之对应的二进制格式,然后将该 Unicode 编号转化为二进制数(去掉高位的 0),最后将该二进制数从右向左依次填入二进制格式的 X 中,如果还有 X 未填,则设为 0 。

比如:“马”的 Unicode 编号是:0x9A6C,整数编号是 39532,对应第三个范围(2048 - 65535),其格式为:1110XXXX 10XXXXXX 10XXXXXX,39532 对应的二进制是 1001 1010 0110 1100,将二进制填入进入就为:

11101001 10101001 10101100 。

关于“为何Unicode中文字符占取2个字节,而 UTF-8却占3个字节”的网络解释修正

由于 UTF-8 的处理单元为一个字节(也就是一次处理一个字节),所以处理器在处理的时候就不需要考虑这一个字节的存储是在高位还是在低位,直接拿到这个字节进行处理就行了,因为大小端是针对大于一个字节的数的存储问题而言的。

综上所述,UTF-8、UTF-16、UTF-32 都是 Unicode 的一种实现。

带有bom格式的utf-8

BOM:byte order mark,定义字节顺序,因为网络传输中分为两种,大头和小头。uft-8不需要bom表明字节顺序,但可以用BOM来表示编码方式,windows就是采用bom来标记文本文件的编码方式的。

bom是为utf-16和utf-32准备的,用于标记字节顺序。微软在utf-8中使用bom是因为这样可以把UTF-8和ASCII等编码区分开来,但这样的文件在windows之外的操作系统里会带来问题。

不含bom的UTF-8才是标准形式。UTF-8」和「带 BOM 的 UTF-8」的区别就是有没有 BOM。即文件开头有没有 U+FEFF。
UTF-8 的网页代码不应使用 BOM,否则常常会出错。

为什么要这么麻烦

那既然字库表中的每一个字符都有一个自己的序号,直接把序号转成二进制作为存储内容就好了。为什么unicode还要多此一举通过字符编码把序号转换成另外一种存储格式呢?你看ASCII码为什么不这样?

其实原因也比较容易理解:unicode的目的是为了能够涵盖世界上所有的字符,准备了一个很大的字库表,能够装下1114112个字符,比如最后一个字符对应的序号转成的二进制是100001111111111111111至少占3个字节

但实际使用过程中会发现真正用的上的字符相对整个字库表来说比例非常低。例如中文地区的程序几乎不会需要日语字符,而一些英语国家甚至简单的ASCII字库表就能满足基本需求。

而如果把每个字符都用字库表中的序号转成的二进制来存储的话,每个字符就需要3个字节(这里以Unicode字库为例),这样对于原本用仅占一个字符的ASCII编码的英语地区国家显然是一个额外成本(存储体积是原来的三倍)。算的直接一些,同样一块硬盘,用ASCII可以存1500篇文章,而用3字节Unicode序号存储只能存500篇。于是就出现了UTF-8这样的变长编码。在UTF-8编码中原本只需要一个字节的ASCII字符,仍然只占一个字节。而像中文及日语这样的复杂字符就需要2个到3个字节来存储。

char采用的是UTF-16BE编码格式

java文件的编码方式可能有多种多样,但java编译器只要指定了源文件的编码方式,会自动按照java文件的编码格式正确读取后产生class文件,这里的class文件编码是UTF-16BE编码。

JVM加载class文件读取时候使用Unicode编码方式正确读取class文件,那么原来定义的String s="汉字";在内存中的表现形式是Unicode编码,UTF-16表示汉字只需2个字节,char类型刚好装得下;要是使用UTF-8就不一定了

不管在编译前java文件使用何种编码,在编译后成class后,他们都是一样的----Unicode编码表示。

char c = 'a’;a的字符编码是00000000 01100001转成int类型展现10进制的数,即97int i = c;//i=97    天的utf-16BE编码是0101100100101001,对应16进制是5929c = 0x5929;//打印c结果是天

java常见的转义字符

一般使用\开头,把一个字符转义

\n : 换行
\t : 制表符tab
\r : 换行
\f : 换页
\u: 把16进制的编码转成对应的字符

char c = '\n';System.out.println(c);System.out.println(2);可以看到2前面多了一行空白行其实ln表示当前行结束打印,要继续打印就要到下一行,不信把ln去掉    System.out.print(2);System.out.print(2);
System.out.print("s"+'\t'+2);可以看到s与2隔了一个tab键的距离
以天的16进制为例,5929char c = '\u5929';//c='天'
怎么输出一个','是有特殊含义的字符,代表字符的开始char c = '\'';//使用\代表'是一个普通的字符
同理想输出一个\char c = '\\';    

转载自十分钟搞清字符集和字符编码Unicode与UTF-8的区别Java java采用的编码、JVM平台默认字符集和外部资源的编码utf-8与带有BOM的utf-8的区别UTF-8的BOM是什么意思计算机中编码方式---ASCII,ISO-8859-1以及UTF-8和UTF-16编码计算机中编码方式---ASCII,ISO-8859-1以及UTF-8和UTF-16编码

本文来自那么简洁的博客园,作者:赤北,转载请注明原文链接:https://www.cnblogs.com/cqhh/p/15181487.html

标签:97xxo-

SEO小店网站优化 能带来大量精准流量的网站才是好网站,小店网络公司SEO优化推广可以为企业网站带来大量的有效流量。 ...

汉寿网站排名快速提升 汉寿网络公司快速提升企业网站排名,通过网站优化推广,让汉寿企业网站在搜索引擎的排名长期稳定。 ...

SEO张家界网站优化 能带来大量精准流量的网站才是好网站,张家界网络公司SEO优化推广可以为企业网站带来大量的有效流量。 ...

lol韩服王者排名实时查询?查英雄联盟职业选手排名的小程序叫 "韩服排名小程序 "所以当你打开上的搜索框,搜索 "韩服排名,可以看到韩服排名小程序,点击即可添加。也方便搜索所有英雄联盟职业选手的实时记录,了解该选手的具体排名信息。怎么看lpl选手的rank?可以在opgg查询,在小程序查看韩服排名,或者下载一个英雄联盟官方助手。我们可以在游戏搜索中输入他们的账号名称,然后就可以点击进去查看他们的记...

什么是CBA季前赛?CBA篮球季前赛是指正式比赛前的比赛。当一个赛季即将开始的时候,cba每年都会为各个球队准备一些比赛,也就是所谓的季前赛,以便为各个球队磨合阵容,考察球员。季前赛的结果不带入常规赛。每支球队都非常重视比赛,通过比赛能够快速进入比赛状态,为常规赛取得好成绩打下基础。cba季前赛什么意思?CBA季前赛是常规赛的前奏,比赛胜负不算。季前赛的目的多是球队磨合阵容,考察外援,培养新人。c...

请教宝路华手表怎么样?包华手表在欧美国家非常有名。在我们国家,到了一定年龄的长辈也懂点东西。这是一块完整的瑞士手表。它的价格不是很高,普通款2000-6000左右。高端的有几个W码。现在很多白领都有布鲁华手表,你可以找身边的朋友打个电话联系布鲁华公司,或者登陆布鲁华中文网。瑞士手表宝路华怎样?包华宝路华手表属于中低档瑞士品牌手表。主要是价格比较便宜,用的是塞利塔公司的机芯。或者主要是模仿埃塔运动。...

TOP