ansi unicode_ansi unicode utf-8

ansi unicode_ansi unicode utf-8利用今天一天的时间,研究了一下ANSI编码和Unicode编码的不同,下面把我的研究成果写下来,以备日后参考。       ANSI编码最常见的应用就是在Windows当中的记事本程序中,当新建一个记事本,默认的保存编码格式就是ANSI,ANSI应该算是一种压缩编码了,当遇到标准的ASCII字符时,采用单字节表示,当遇到非标准的ASCII字符(如中文)时,采用双字节表示。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

        利用今天一天的时间,研究了一下ANSI编码和Unicode编码的不同,下面把我的研究成果写下来,以备日后参考。

        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进制的形式显示,如下图所示

 

新建文本文档(后转为Unicode编码)

 

复件 新建 文本文档(ANSI编码)

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

       采用Unicode编码存储的文本文档:

 

Unicode字符解释

       采用ANSI编码存储的文本文档:

 

ANSI字符解释

 

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

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

        用Unicode编码的“宋体”

用Unicode编码的“宋体”

 

        用ANSI编码的“宋体”

 

用ANSI编码的“宋体”

       在Unicode编码中,“宋”这个汉字的编码为5B 8B,按照二进制的说法,5B是高八位,8B是低八位,然而,对照着前面所标注的结果,用Unicode编码的文本文件中,先存储的是8B这个低八位,然后再存储的5B这个高八位,这就是Windows内部在处理Unicode字符的时候与其他系统(如Mac OS)的不同,Windows先处理Unicode字符的低八位,然后再处理高八位;而有的系统是先处理高八位,再处理低八位,这就是为什么在Internet上要规定“网络字节序”。(  更正:本地字节序处理顺序只与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中看起来很正常。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193612.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python json.loads 中文_Python 的完美 json loads

    python json.loads 中文_Python 的完美 json loads为了对付表单提交时参数多和json结构复杂的情况,我写了一个名为recursive_json_loads的处理函数来对请求对象递归调用json.loads()以期能够一次性将所有参数转化为更好用的Python类型。后来又发现了web.py的Storage对象,使这个函数越发好用起来。lang:pythonimportsimplejsonasjsondefrecurs…

    2025年6月16日
    4
  • IDEA2021.5.1-2038激活码激活【在线注册码/序列号/破解码】「建议收藏」

    IDEA2021.5.1-2038激活码激活【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    55
  • c++字符串转int_python中lower的用法

    c++字符串转int_python中lower的用法在做ACM题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long和int范围是[-2^31,2^31),即-2147483648~2147483647。而unsigned范围是[0,2^32),即0~4294967295。也就是说,常规的32位整数只能够处理40亿以下的数。那遇到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展了。不同的编

    2025年8月24日
    4
  • 编写测试用例的思路_用例测试方法

    编写测试用例的思路_用例测试方法前言用过pytest的小伙伴都知道,pytest的运行方式是非常丰富的,可以说是你想怎么运行怎么运行,想运行哪些运行哪些,那httprunner是否同样可以呢?运行用例的各种方式运行指定路径的用

    2022年8月6日
    6
  • 国密算法概述_国密算法一定要通过硬件吗

    国密算法概述_国密算法一定要通过硬件吗国密即国家密码局认定的国产密码算法,即商用密码。国密算法是国家密码局制定标准的一系列算法。其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法。具体包括SM1,SM2,SM3等,其中:SM2为国家密码管理局公布的公钥算法,其加密强度为256位。其它几个重要的商用密码算法包括:SM1,对称加密算法,加密强度为128位,采用硬件实现;SM3,密码杂凑算法,杂凑值长度为32字节,和SM2算…

    2022年10月7日
    2
  • dump文件 linux,Linux下快速分析DUMP文件「建议收藏」

    dump文件 linux,Linux下快速分析DUMP文件「建议收藏」dump文件传输到本地进行分析,常常需要大量的等待时间。使用IBM的eclipse的MAT工具可以直接在服务器上进行快速DUMP分析。运行环境要求linux操作系统JDK8以上下载MAT的linux版本Eclipse的MAT工具下载链接MAT支持各种操作系统,找到Linux版本下载下来#运行uname-m看一下linux是x86_64还是x86的帮助你选择下载那个版本。uname-…

    2022年10月2日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号