宝哥软件园

关于计算机编码问题的陈词滥调(必读文章)

编辑:宝哥软件园 来源:互联网 时间:2021-09-04

计算机中的编码问题

因为计算机只能处理数字,所以如果要处理文本,必须先将文本转换成数字,然后才能处理。最早的计算机在设计中使用8位作为一个字节,因此一个字节可以表示的最大整数是255(二进制11111111=十进制255)。如果你想表示一个更大的整数,你必须使用更多的字节。例如,两个字节可以表示的最大整数为65535,四个字节可以表示的最大整数为4294967295。

一、目前常用的编码

ASCII编码:自从计算机被美国人发明以来,最早只有127个字母被编码到计算机中,即大写的英文字母、数字和一些符号。这个编码表叫做ASCII编码,比如大写字母A的编码是65,小写字母Z的编码是122。

GB系列编码:但是很明显,一个字节处理中文是不够的,至少需要两个字节,不能和ASCII编码冲突。因此,中国制定了GB2312编码来编译中文。此外,全世界有数百种语言。日本将日文编译成Shift_JIS,而朝鲜将韩文编译成Euc-kr。由于各国都有国家标准,冲突将不可避免地发生。因此,在混合多语言文本中会出现乱码字符。GB系列代码是我国的国家标准代码,用于存储汉字。它们分为GB2312、GBK和GB18030,基本兼容,目前最常见的是GBK。

Unicode编码:Unicode将所有语言统一成一套编码,这样就不会出现乱码的问题。Unicode标准也在发展,但最常见的方式是用两个字节来表示一个字符(如果要使用非常远的字符,则需要四个字节)。现代操作系统和大多数编程语言都直接支持Unicode。但是,他只指定了字符的编码,而没有指定如何存储或传输字符。因此,UTF系列编码规定了Unicode编码的存储和传输方式。

UTF编码系列:目前最常用的UTF编码分为三种,UTF-8、UTF-16和UTF-32。我们知道计算机存储数据是以8位为一个字节,而UTF-16和UTF-32分别用2字节和4字节来表示一个字符,所以这里我们关心的是字节的存储顺序,是低位优先还是高位优先,从而产生BOM。

BOM是文本文件开头的特殊标记,用一组特殊的数字来标记文本文件的字节顺序。虽然UTF-8的字节顺序是固定的,但是为了与UTF-16和UTF-32兼容,UTF-8的BOM也指定了标记UTF-8编码。但是UTF-8 BOM在不同的平台上有不同的规定,所以要谨慎使用。

物料清单指定如下:

UTF 8号英孚高炉

UTF-16(LE) FF FE

UTF-16(BE) FE FF

UTF-32(LE) FF FE 00 00

UTF-32(BE) 00 00 FE FF

UTF-8编码:如果统一为Unicode编码,乱码问题就会消失。但是如果你写的文字基本都是英文的,那么Unicode编码需要的存储空间是ASCII编码的两倍,在存储和传输上非常不经济。于是,本着节约的精神,将Unicode编码转换为“变长编码”的UTF-8编码再次出现。UTF-8编码根据不同的数字将一个Unicode字符编码为1-6个字节,常见的英文字母编码为1个字节,中文字符通常为3个字节,只有罕见的字符编码为4-6个字节。如果要传输的文本包含大量英文字符,UTF-8编码可以节省空间:

字符ASCII Unicode UTF-8a 01000001 000000 0100001 01000001 X 01001110 001101 11100100 101100 1011000 101101 II。编码在计算机系统中的应用

计算机内存统一使用Unicode编码,需要保存到硬盘或传输时,转换为UTF-8编码;使用记事本编辑时,从文件中读取的UTF-8字符会转换为Unicode字符并存储在内存中。编辑后,保存时,将Unicode转换为UTF-8并保存到文件:

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

因此,你可以看到很多网页的源代码会有类似于metacarset=' UTF-8'/的信息,这表明网页是用UTF-8编码的。

第三,Java中的编码问题

直接编写一个演示,看看eclipse中java项目的编码是什么样的。

1、将字符串转换成字节序列

public class encode demo { public static void main(string[]args){//todo自动生成的方法存根字符串=' cloud opens德龙summer ';byte[]byte 1=s . GetBytes();//这是将字符串转换为字符数组,转换后的字节序列使用项目的默认编码为(byte b : bytes 1)//to exstring。该函数以十六进制显示字节(转换为int)。out.print(整数。to exstring(b0xff)' ');//0xff是去掉前24个零,只留下最后8位数字。

分析:可以看到在这个java项目的默认编码中,汉字用两个字节表示,而英文用一个字节表示。

通过查看项目,默认代码是

GBK .

如果不想使用项目的默认编码格式,可以指定将字符串转换为所需的编码格式,方法如下:

byte[]byte 2=s . GetBytes(' utf-8 ');//转换为utf-8编码为(byte b : bytes 2)//to exstring这个函数是以十六进制显示字节(转换为Int)。out.print(整数。to exstring(b0xff)' ');//0xff是去掉前24个零,只留下最后8位数字system . out . println();byte[]byte S3=s . GetBytes(' utf-16be ');//转换为java双字节编码,utf-16be编码为(byte b : bytes 3)//to exstring这个函数是以十六进制显示字节(转换为Int)。out.print(整数。to exstring(b0xff)' ');//0xff是去掉前24个零,只留下最后8个运算结果:

分析:通过比较两个结果,

Gbk码:中文占两个字节,英文占一个字节。

Utf-8编码:中文占三个字节,英文占一个字节。

Utf-16be编码:中文占两个字节,英文占两个字节。

注意:java是双字节编码和utf-16be编码。也就是说,java中的一个字符(char)占用两个字节!

2.字节序列被转换成字符串

当你的字节序列是某种编码时,如果你想把字节序列变成字符串,你也需要使用这种编码方式,否则会出现乱码字符。

String str1=新字符串(字节1);//此时将使用项目的默认编码进行转换,可能会出现乱码的system . out . println(str 1);String str2=新字符串(字节2);system . out . println(str 2);String str3=新字符串(字节2,' utf-8 ');system . out . println(str 3);运行结果:

4.文本文件编码

文本文件是一个字节序列,它可以是任何编码的字节序列。

如果我们直接在中文机器上创建一个文本文件,那么这个文件只知道ANSI编码(比如在电脑上右键直接创建一个文本文件)。

这里需要注意的是,只有直接创建文本文件时,文件的编码才知道ANSI,但文本文件本身是一个字节序列,可以任意编码。

注:在中文系统中,ANSI编码为GBK编码。

这里有一个例子:

我们在eclipse中创建了一个新项目,并将它的默认编码改为utf-8

所以对于这个项目,它只知道utf-8编码文件。

接下来,我们在这个项目中创建新的文本文件utf-8.txt,并在其中输入以下内容:

如果将这个文本文件直接复制到其他项目中(默认为GBK编码),内容会变得乱码!因为代码不一样!

但是如果是过去复制粘贴的内容,系统会自动转换成相应的代码,不会出现乱码。

注意:如果把这个文本文件复制到其他地方(比如系统的桌面),就不会出现乱码!由于文本文件可以是任意编码序列,系统在读取文本文件时会自动转换为相应的编码格式。

知道文件的编码有什么用?在Java IO流中,我们需要读写文件。使用字节流读写时,必须根据不同的编码方式进行读写。由于不同编码方式下每个字符占用的字节数不同,所以要根据实际情况进行操作。

以上关于计算机中编码问题的老生常谈(必读文章)都是边肖分享的内容,希望能给大家一个参考和支持。

更多资讯
游戏推荐
更多+