zoukankan      html  css  js  c++  java
  • 基本类型

    https://www.zhihu.com/question/23374078(Unicode和UTF-8的区别,写的很好哦)

    这个链接文章的评论区的问答也很有知识点:

     问:想问问编码规则这样做的意义是什么?看起来好像就是把一个ID翻译成了另一个ID

    回答:规范存储方式(比如大小端)、一定程度的压缩

    主要为了编解码方便,以及存储暂用少。

    问:请问答主,既然UTF-8是Unicode字符集的一种编码规则,那么GBK和GB2312等中文字符集的编码规则就是他们本身吗?或者说这些字符集是否只有一种编码方式且编码方式与字符集同名?找了很久没有找到答案~

    回答:定义字符集的同时,定义了一种编码方式。这在 Unicode 之前很常见,所以一般情况下大家都不会刻意区分字符集和编码方式。你可以在维基百科找到说明,也可以搜一下标准原文看看,比如 GB2312 的文本:

    java的8大基本类型:https://www.runoob.com/java/java-basic-datatypes.html
    byte((字节型)):8位,最大存储数据量是255,存放的数据范围是-128~127之间。
    short(短整型):16位,最大数据存储量是65536,数据范围是-32768~32767之间。
    int(整型):32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
    long(长整型):64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
    float(单精度浮点型):32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。有效数位是 7 位
    例如:float a=1.3; 会编译报错,正确的写法 float a = (float)1.3;或者float a = 1.3f;(f或F都可以不区分大小写)
    double(双精度浮点型):64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。有效数字16位,如果不声明,默认小数为double类型
    boolean(布尔型):只有true和false两个取值。
    char(字符型):
    字符,字符集 和字符编码:https://baike.baidu.com/item/Java%E5%AD%97%E7%AC%A6/4914060?fr=aladdin
    1.用英文单引号括起来的单个字符,例如:'a'、'字'。这是最常见的声明字符形式。
    2. 用英文单引号括起来的十六进制字符代码值来表示单个字符。其格式为:'uXXXX',其中u是约定的前缀(u是unicode的第一个字母),而后面的XXXX位4位十六进制数,是该字符在unicode字符集中的序号。例如:'uFFFF'。
    char:16位,char本质上是一个固定占用两个字节的无符号正整数,这个正整数对应于Unicode编号,用于表示那个Unicode编号对应的字符。由于固定占用两个字节,char只能表示Unicode编号在65 536以内的字符,而不能表示超出范围的字符。
    最小值是 u0000(即为0);
    最大值是 uffff(即为65,535)
    char比较特殊:
    char类型赋值
    char a = 'a'; //任意单个字符,加单引号。
    char a = '中';//任意单个中文字,加单引号。
    char a = 111;//整数。如果不带引号,可以等于整数,范围是0~65535。十进制、八进制、十六进制均可。这时候的整数表示的是unicode的编码,输出的是该编号对应的unicode字符,输出字符编码表中对应的字符,例如:char r = 65,sout(r)输出的是A,因为A在unicode中的十进制unicode编号就是65

    char(字符型)

    (关于char unicode和utf-8字符)

    https://www.cnblogs.com/xdyixia/p/9114145.html

    https://zhidao.baidu.com/question/21684171.html

    关于char是unicode字符的理解,char表示的是unicode字符集,可以存储所有他可以存储的unicode字符,那么为什么可以在utf-8编码中展示呢?首先utf-8这些编码,是为了存储和传输的作用的(比如保存一个文件,会转为utf-8对应的字符编码,而打开的时候,会根据你文件内容根据对应编码,转为我们认识的字符,比如汉字"王"对应utf-8编码是qwer,那么保存为文件时,存的就是qwr,而打开时再将qwer根据utf-8解码,展示为王),但是在java中,运行的时候都是要被转为unicode,就算同一个汉字在unicode中是2字节,而在utf-8中是20字节,都没关系,我都可以char="王",因为这只是给你看的,虽然保存为文件时,在utf-8编码下,王变为了20字节,但是依旧char="王",因为这里的等于是表示uncode的,因为最后都是要转为unicode的,当然可以相等了.utf-8只是为了展示,保存的用的,运行的时候,并不是说用这个20个字节去对应unicode,而是会将utf-8表示字节转为uincode的2字节表示方式,所以最后形式是可以对应的、存储过程当中用于表示字符的以字节为单位的二进制序列.也就是说在尽管你是char是unicode字符,但是utf-8不管你,不管是展示还是保存,我都是按utf-8格式进行展示和保存的,尽管我utf-8格式的汉字保存为文件,转为3个字节,但是这个我们不管,因为尽管你是三个字节,在运行到java内存时,我都要将你的所有内容转为unicode格式,转为字节

    https://zhidao.baidu.com/question/21684171.html

    当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:

    检测文件头标识,提示用户选择,根据一定的规则猜测
    最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表:
    EF BB BF UTF-8
    FE FF UTF-16/UCS-2, little endian
    FF FE UTF-16/UCS-2, big endian
    FF FE 00 00 UTF-32/UCS-4, little endian.
    00 00 FE FF UTF-32/UCS-4, big-endian.

    PS:如果输入字符(如 char a = ' 6'),那么输出的就是他代表的值6;但是char a = ' 65'是会报错的哦,因为65有2个字符了,分别是6和5,会报错超出字符限制了。也就是想直接表达数字的,只有有一个数字 char a = ' 6'

    如果输入的是数字(如 char a = 65),则会输出对应的字符 A,因为A在unicode中的十进制编码就是65,其他进制的也行因为最终都会转为二进制,unicode喜欢用16进制表示,

    比如:
    char r = 65;
    System.out.println(r);
    那么输出的是A,因为A在unicode中对应的编码就是65,所以表示为整型时,输出的就是编码对应的字符
    而汉字和字母就还是汉字
    int n1 = 'A'; // 字母“A”的Unicodde编码是65
    int n2 = '中'; // 汉字“中”的Unicode编码是20013
    
    当你使用一个整型去定义一个char型,实际指的是他代表的字符,而你用一个字符去定义一个char型,也可以得到他所代表的值。
    比如:
    char ch1 = 49;
    char ch2 = '1';
    System.out.println(ch2);
    此时输出的还是1。
    这两个是等价的
    ch1 == ch2
    (int)ch1 == (int)ch2
    
    
    还可以直接用转义字符u+Unicode编码来表示一个字符:
    // 注意是十六进制:
    char c3 = 'u0041'; // 'A',因为十六进制0041 = 十进制65
    char c4 = 'u4e2d'; // '中',因为十六进制4e2d = 十进制20013

    二进制转为十进制计算

    从二进制数的最右数起,最右方的第一个数乘以2的0次方,第二个数乘以2的1次方……依次类推,把各结果累计相加就是转换后的十进制数。

    例如:00100000

    左侧数1的右侧还有5位,那么就是1*2的五次方=64,因为其他数字是0,乘了也是0,我就省略了

    01000001

    左侧第二个1右侧还有6位数,最后一个1右侧还有0个数

    1*2六次方+1*2的零次方=65

    编码unicode utf-8编码详解

    编码的好文章:

    https://blog.csdn.net/Deft_MKJing/article/details/79460485

    https://blog.csdn.net/qq_22771739/article/details/84261165

    在Java中做一个总结:

    在我们编译器把java源文件编译成.class文件的时候需要用到文件的编码,我们一般设置成UTF-8,如果文件是其他编码就有可能出现错误,之前的一片博文里面就有提到字符编码集导致的错误。但一旦编译成.class文件开始,就不用在乎关于我们程序源码的什么UTF-8编码了,因为已经完成了从UTF-8编码的文件转成与平台无关的.class文件了,也就是说已经把根据UTF-8编码方式转成了Unicode。

    引用下别人博客中的内容:

    在Java(其中主要包括在JVM中、内存中、在代码里声明的每一个char、String类型的变量中。)中字符只以一种形式存在,那就是Unicode,不选择任何特定的编码,直接使用它们在字符集中的编号,这是统一的唯一的方法。

    在JVM内部,统一使用Unicode表示当着字符从JVM内部移动到外部时(即保存为文件系统中的一个文件内容时),就进行了编码转换,使用了具体的编码方案。因此也可以说,所有的编码转换只发生在边界的地方,也就是各种输入/输出流的起作用的地方。

    2.UTF-8编码方式

    注意:UTF-8编码方式是一种文件的存储方式,只发生在边界的地方,也就是各种输入/输出流的起作用的地方。

    粘贴一篇别人的博文:

    我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。

    上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。

    ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。

  • 相关阅读:
    蒙特卡洛采样、重要性采样
    伯努利分布和高斯分布下的最大似然估计、交叉熵
    对于分类问题的神经网络最后一层的函数:sigmoid、softmax与损失函数
    android 侧滑菜单
    安卓Animation类与xml制作动画
    LeetCode题解 #3 Longest Substring Without Repeating Characters
    GY89的使用
    使用GY89的BMP180模块获取温度和压强(海拔)
    STM32与PC机串口通讯
    STM32使用无源蜂鸣器演奏歌曲
  • 原文地址:https://www.cnblogs.com/cherishforchen/p/13359694.html
Copyright © 2011-2022 走看看