首页 > 编程知识 正文

unicode与utf8的区别,怎么转换为ansi编码

时间:2023-05-05 13:03:52 阅读:151172 作者:3873

今天用了一天时间,研究了ANSI代码和Unicode代码的区别。 以下写下我的研究成果,准备

日后参考。

在Windows记事本程序中,ANSI编码最常见的APP类型是创建新记事本时的默认存储编码

我是ANSI。 ANSI应该可以说是压缩编码。 遇到标准ASCII字符时,采用单字节表示,遇到非标准时

的ASCII字符(如中文),用双字节表示。

Unicode编码标准已被近年来许多新的科学技术采用,包括可扩展标记语言(XML )、Java过程

用语言和最新的操作系统。

通过实验研究这些差异:

首先准备的软件有用于比较文本的UltraEdit,然后是用于分析网络字节序的辅助站点

进入正题,在空白文件夹下创建记事本文档“新文档. txt”,thdxbc输入“宋体”

ABC ) enter " (不含引号,最后在ABC之后键入enter )。 保存并关闭文档,选择此文件,然后将其拉直

复制粘贴,在同一文件夹下创建“复制的新文本文档. txt”,然后再次打开“新文本文档”

. txt,从菜单中选择“文件”>“另存为”,然后在“另存为”对话框的底部选择Unicode。 保存并选择替换。

然后打开UltraEdit,从菜单中选择“文件”“比较文件”(或直接按快捷键Alt F11 ),并选择要比较的第一个文件作为“新建”

选择文本文档. txt,然后选择“新建副本”作为要比较的第二个文件

文本文档. txt,在“比较模式”下选择一个文件,在“两者比较”、“要比较的第一个文件”下选择“二进制”,在“编辑器平铺”下选择“垂直平铺”,然后单击“比较”

比较两个文本文件并以十六进制格式显示,如下图所示

通过分析,其代表性含义如下图所示

以Unicode编码保存的文本文档

以ANSI编码保存的文本文档

用Unicode编码文本时,前两个字节一定是FF FE,用于指示此文档是用Unicode编码的

让我们关注一下内容的编码部分

中文作为非ASCII字符,不能只用一个字节来表示汉字。 必须至少用2个字节表示。 因此,中文是双字节字符。 下图显示了在http://bm.kdd.cc/index.asp上查找的“宋体”的两个汉字,分别使用了Unicode和ANSI代码

用unicode编码的“宋体”

用ANSI编码的“宋体”

在unicode的代码中,“宋”这个汉字的代码是5B

8B根据二进制,5B是前8位,8B是后8位。 但是,与上述表示形式的结果相反,用Unicode编码的文本文件中首先存储的是名为8B的后8位。 但是

后来保存的5B这前8位在Windows内部处理Unicode字符时与Mac等其他系统

OS )的不同之处在于,Windows先处理Unicode字符的后8位,然后处理前8位。有些系统先处理前8位,再处理后8位。 所以呢

在互联网上必须规定“网络的字节序”。

在ANSI代码中完全没有这个问题。 “宋”的ANSI代码是CB CE,存储这些字符时也以高位8位、低位8位存储。

以上讨论了Unicode和ANSI编码中的中文特征。 接下来,我们来看看这两种编码中的ASCII字符的特征。

Unicode以两个字节存储所有字符,但如果ASCII字符可以用一个字节表示,则另一个字节的内容将设置为00。 录用

Unicode的缺点是,如果一篇文章包含英语,使用Unicode方法对存储进行编码将消耗大约两倍的存储容量(请参阅)

字节的FF

FE标记) )但是,使用Unicode代码的好处是它适合同一文档中不同语言的文本。 因此,Unicode代码被广泛用于编写xml语言和多语言程序。

在本论文的第2个图中,可知采用了Unicode代码的大写字母a为00代码

41 )之前,Windows说明了处理Unicode字符时,首先处理后8位,然后处理前8位。 因为存储在Unicode中的字符都占用2个字节的空间

因为是间,所以解码时各取2个字节。 如果发现前8位不是00,则认为这2个字节表示非ASCII字符,相反,如果发现前8位是00,

因为这个文字是ASCII文字,所以取出后8位,从ASCII代码表中找到对应的文字。 因为可以认为取出的后8位表示ASCII字符,所以字符空间为2的8次

方,也就是256个,所以采用

Unicode编码表式的ASCII字符属于扩展的ASCII字符集。

在第二组图的ANSI编码解释中可以看到,存储一个大写英文字母A仅用了一个字节,内容为41。十六进制的41转换为八位的二进制后应该

是 01000001,可以看到,此二进制数的最高位为0,ANSI编码在存储ASCII字符时采用的是传统的ASCII字符集,其字符数量为128,正

好2的7次方就是128,因此最高位一定是0。汉字“宋”的ANSI编码为CB

CE,将这两个字节的十六进制数转换为二进制,结果为[11001011][11001110] ,每个字节的最高位都是1,由此可以推断在解码的时候,

一次读取一个字节的内容,看一下该字节的最高位是否为1,如果为1,暂存该字节,并读取下一个字节,新读取的这个字节的最高位应该也为1,这样将两个字节

合并然后去查询对应的字符;如果第一次读到的一个字节最高位为0,那么就按此字节的内容直接查询传统的ASCII码表,找到对应的字符。

最后再分析Windows中的回车换行特点。在开始的时候为了准备这个实验用的文本文档,在输入完ABC后又输入了一个回车。但是通过分析得知,在

文本存储的时候并不是仅存了一个“回车”,还存了一个“换行”,而且是先存储的“回车”后存储的“换行”(见ASCII码表:0D->回

车;0A->换行),这与Linux/Unix中的换行方式不同,在Linux/Unix中仅用一个0D(回车)就可以令文本换行。如果将一个在

Linux/Unix中编写的文本文档直接拷贝到Windows中打开(最简单的可以在Windows下查看百度首页的源代码),就会看到这些文字几乎都

是连着的,没有换行,那是因为在该文档中并没有显式地存储0A(换行符),虽然这篇文章在Linux/Unix中看起来很正常。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。