关于计算机编码问题的陈词滥调(必读文章)
计算机中的编码问题
因为计算机只能处理数字,所以如果要处理文本,必须先将文本转换成数字,然后才能处理。最早的计算机在设计中使用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流中,我们需要读写文件。使用字节流读写时,必须根据不同的编码方式进行读写。由于不同编码方式下每个字符占用的字节数不同,所以要根据实际情况进行操作。
以上关于计算机中编码问题的老生常谈(必读文章)都是边肖分享的内容,希望能给大家一个参考和支持。
版权声明:关于计算机编码问题的陈词滥调(必读文章)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。