`
tsinglongwu
  • 浏览: 231514 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

(转)ANSI编码和Unicode编码的不同-chaijunkun-CSDN

阅读更多

ANSI编码最常见的应用就是在Windows当中的记事本程序中,当新建一个记事本,默认的保存编码格式就是ANSI,ANSI应该算是一种压缩编码了,当遇到标准的ASCII字符时,采用单字节表示,当遇到非标准的ASCII字符(如中文)时,采用双字节表示。

Unicode编码标准已在近年来的多种新科技当中被加以采用,包含了可扩展置标语言(XML)、Java程序语言、以及最新的操作系统中。

下面用实验的方法来进行研究这两者之间的差别:
首先要准备的软件有UltraEdit,用于对文本进行比较;其次用于分析网络字节序的辅助网站
http://bm.kdd.cc/index.asp

步入正题,在一个空白的文件夹下创建一个记事本文档“新建 文本文档.txt”,在里面输入“宋体ABC(回车)”(不包含引号,最后要在ABC后输入一个回车),保存并关闭该文档,将此文件选中之后直接复制、粘贴,在相同的文件夹下就产生了“复件 新建 文本文档.txt”,再次打开“新建 文本文档.txt”,选择菜单中的“文件”->“另存为”,在另存为对话框中,最下面有“编码”,选择Unicode。保存,选择替换。

然后打开UltraEdit,在菜单中选择“文件”->“比较文件”(或直接按快捷键Alt+F11),选择第一个要比较的文件为“新建 文本文档.txt”,选择第二个要比较的文件为“复件 新建 文本文档.txt”,“比较模式”选择文件,“二方比较”,“要比较的第一个文件”为“二制”,“编辑器平铺”选择“垂直平铺”,点击“比较”,程序自动对这两个文本文件进行比较,并以16进制的形式显示,如下图所示


ANSI编码:


UNICODE编码:


  根据分析,其代表的意义如下图所示




在用Unicode对文字进行编码时,头两个字节一定是FF FE,这样用来标识此文档以Unicode编码。下面来关注一下内容的编码部分:

中文,作为一种非ASCII字符,不可能只用一个字节来表示一个汉字,至少需要用两个字节来表示,所以,中文是一种双字节字符,下图所示的是在http://bm.kdd.cc/index.asp上查询到的“宋体”两个汉字,分别用Unicode编码和ANSI编码的十六进制内容:


ANSI编码: 


UNICODE编码:

在Unicode编码中,“宋”这个汉字的编码为5B 8B,按照二进制的说法,5B是高八位,8B是低八位,然而,对照着前面所标注的结果,用Unicode编码的文本文件中,先存储的是8B这个低八位,然后再存储的5B这个高八位,这就是Windows内部在处理Unicode字符的时候与其他系统(如Mac OS)的不同,Windows先处理Unicode字符的低八位,然后再处理高八位;而有的系统是先处理高八位,再处理低八位,这就是为什么在Internet上要规定“网络字节序”。(2011.3.29 更正:本地字节序处理顺序只与CPU架构有关,与操作系统无关,之前误以为Mac OS与Windows不同是因为Mac机之前使用的是PPC处理器,该处理器采用大端对齐方式,而从Mac OS 10.4开始出现了支持Intel x86 CPU的系统,这时基于Intel x86架构处理器的Mac机字节序变为小端对齐。另外,本文中所述Unicode编码也不严谨,应为UTF16编码。特此更正)


在ANSI编码中,完全不存在这个问题,“宋”的ANSI编码为CB CE,在存储这些字符的时候也是按照先高八位,后低八位的方式存储的。

以上讨论了中文在Unicode和ANSI编码中的特点,下面看一下ASCII字符在这两种编码中的特点:


在Unicode中,所有字符都是以两个字节来存储的(2011.6.22更正:在UTF-16编码格式中,并非所有字符都是以两个字节来存储的。试想一下,如果仅仅用两个字节来存储一个字符,编码空间为65536个,这个数量连中文都包含不全。之前的理解有偏差,UTF-16编码是以两个字节为基本编码单位来存储的。如果一个字符超出了这两个字节所能表示的空间,则会再次申请两个字节来编码。特此更正),而ASCII字符仅用一个字节就可以表示,那么另外一个字节的内容就会被置为00。采用Unicode会产生的缺点就是:如果一篇文章里全是英文,那么,采用Unicode方式编码存储,所占用的存储空间会大约增加一倍(因为头部还要多两个字节的FF FE标识),但是采用Unicode编码的好处就是适合同一文档中采用不同语言的文字,因此Unicode编码广泛应用于xml语言和编写多语言程序。


在本文的第二组图中,可以看到,采用Unicode编码的大写英文字母A,其编码为00 41(之前曾经解释了Windows在处理Unicode字符的时候先处理低八位,后处理高八位),因为Unicode存储的任何字符都占用2个字节的空间,所以在解码的时候就两个字节两个字节地取。如果发现高八位不是00,则认为这两个字节表示一个非ASCII字符,反之如果发现高八位为00,则可知,该字符为ASCII字符,于是取出低八位,再根据ASCII码表查到对应字符,因为取出的低八位认为表示的是一个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中看起来很正常。

 

 

  • 大小: 10.2 KB
  • 大小: 9.2 KB
  • 大小: 34.3 KB
  • 大小: 2.8 KB
  • 大小: 2.6 KB
  • 大小: 37.8 KB
分享到:
评论

相关推荐

    文本文件编码转换:ANSI、Unicode、UTF-8相互转换(修改版)

    ANSI --> Unicode ANSI --> Unicode big endian ANSI --> UTF-8 ...ansi转别的,不检验BOM,一律作为ansi编码进行转换 unicode转别的,首先检验BOM,不合格不转换 utf8转别的,首先检验BOM,不合格不转换

    TXT编码批量转换 V2.0编码UnicodeANSIUTF-8互转软件功能Unicode转ANSI转UTF-8互转软件.exe

    Txt文件编码批量转换器用于批量转换txt文本文档的编码格式。通常,我们电脑里的txt文件都是ASNI编码,当放到手机或MP3里时,打开看到的往往...目前,它支持ASNI、UTF-8、Unicode和Unicode big endian等编码的相互转换。

    易语言Ansi与Unicode转换源码

    在易语言中进行Ansi到Unicode或Unicode到Ansi的转换,主要是为了处理不同编码间的兼容性和数据交换。转换源码可能涉及以下关键步骤: 1. **读取Ansi文本**:首先,你需要读取存储为Ansi格式的文本文件,这通常通过...

    字符编码转换类,支持 ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换

    在IT领域,字符编码是处理文本数据的基础,不同的编码方式决定了如何存储和解析字符。本文将深入探讨PHP中的字符编码转换,特别是针对ANSI、Unicode(包括Little Endian和Big Endian)、UTF-8以及UTF-8+BOM的转换。 ...

    unicode转ansi源码 带码表 不使用系统api

    网上找了好多都没有源码,参考...unicode2ansi---------------vc工程 unicode到ansi编码转换的例子,有函数,有调用 bldunitable----------------别人的代码,用来生成码表的,“unicode2ansi码表1.txt”就是他生成的

    批量转换Ansi文本至Unicode文本工具

    标题中的“批量转换Ansi文本至Unicode文本工具”是指一种软件工具,它的主要目标是将存储为Ansi编码格式的文本文件转换成Unicode编码格式。Ansi编码是一种基于特定区域设置的编码方式,通常与系统默认语言关联,不...

    C语言UTF8到ANSI和Unicode转换代码

    本文将深入探讨C语言中UTF8、ANSI和Unicode字符集之间的转换方法,以及如何在MFC(Microsoft Foundation Classes)项目中集成这些转换代码。 首先,我们要了解UTF8、ANSI和Unicode的概念。UTF8是一种变长的Unicode...

    UTF-8转ANSI文本文件转换器

    综上所述,"UTF-8转ANSI文本文件转换器"涉及到了字符编码的基础知识、编码转换的原理以及批量处理和代码设计的实践。理解和掌握这些知识点,对于处理文本文件编码问题、开发相关工具或理解软件内部工作流程都...

    批量将文件编码方式由ansi转为utf-8

    ANSI和UTF-8是两种不同的编码格式,"格式转换"是指从一种编码转换到另一种,"批量处理"意味着我们需要对多个文件进行同样的操作,而不是逐个手动操作。 在实际操作中,可以使用各种编程语言如Python、批处理脚本...

    Ansi Unicode UTF8编码转换及代码示例

    由于ANSI编码依赖于具体的平台和语言环境,因此从ANSI转换到Unicode时,需要明确使用的具体ANSI编码格式(如Windows-1252等)。转换过程大致如下: 1. **从ANSI到Unicode**:首先需要确定ANSI编码类型,然后使用...

    封装ANSI,UNICODE,UTF8互相转换类

    不同的编码标准使得计算机能够存储、传输和解析各种语言的字符。"封装ANSI,UNICODE,UTF8互相转换类"是一个专门解决字符编码转换问题的工具,尤其适用于处理多语言环境下的文本数据。以下是对这些编码方式以及它们...

    易语言Ansi与Unicode转换

    易语言Ansi与Unicode转换源码,Ansi与Unicode转换,AnsiToUnicode,UnicodeToAnsi,AnsiToUnicode2,UnicodeToAnsi2,RtlAnsiStringToUnicodeString,RtlUnicodeStringToAnsiString,RtlFreeUnicodeString,RtlFreeAnsiString...

    lua utf8 unicode ansi 转换

    a2w(ansi to unicode) u2w(utf8 to unicode) w2a(unicode to ansi) w2u(unicode to utf8) u2a(utf8 to ansi) a2u(ansi to utf8) bstr(bytes of str) help(show this) wunoman@qq.com 2012/03/06

    打开txt文件,自动识别编码格式ansi,unicode,unicode-BE,utf8,utf8-BOM,并转换为unicode显示到edit

    打开txt文件,自动识别编码格式ansi,unicode,unicode-BE,utf8,utf8-BOM,并转换为unicode显示到edit

    utf-8 ansi 字符互转 工具

    例如“utf-8 ansi 字符互转 工具”就是这样一个软件,它能方便地帮助用户将文件或文本内容在UTF-8和ANSI编码之间进行转换。使用这类工具,用户通常只需选择输入文件、指定输出格式,然后点击转换按钮即可完成操作。 ...

    Android手机端转换Ansi字符串,手机怎么转换为ansi编码,Delphi

    Ansi编码,通常指的是基于特定区域设置的本地化编码,如GBK(中国)或ISO-8859-1(西欧),它与Unicode编码(如UTF-8)不同,后者包含了全球大多数语言的字符。 Delphi是一款强大的面向对象的 Pascal 编程环境,它...

    unicode 转ansi格式

    在编程领域,Unicode 和 ANSI 是两种不同的字符编码标准,它们被用来表示文本数据。Unicode 是一个广泛采用的国际标准,可以表示世界上几乎所有的字符,包括各种语言的文字。而 ANSI 编码,通常指的是 Windows 系统...

    VB中ANSI转换成UTF-8

    ANSI和UTF-8是两种常见的字符编码标准,它们在处理多语言字符时有着不同的特性。本文将深入探讨如何在VB中将ANSI编码转换为UTF-8编码,以及在实际应用中的网络编程基础知识,特别是利用Winsock控件实现简单的聊天...

    Android手机端转换Ansi字符串,手机怎么转换为ansi编码,Delphi源码.rar

    Ansi编码,也称为Windows默认的ANSI编码(通常基于locale的代码页,如GBK或CP1252),在桌面应用中广泛使用,但在Android这种基于Unicode的系统上可能不常见。本主题将深入探讨如何在Android手机端进行Ansi字符串的...

    Ansi转Unicode软件

    ANSI编码和Unicode编码是两种常见的字符编码标准,它们各自有不同的特点和应用场景。本文将详细介绍这两种编码的区别以及如何在Windows操作系统下进行转换。 首先,ANSI编码,也称为Windows默认的多语言编码或代码...

Global site tag (gtag.js) - Google Analytics