【转】刨根究底字符编码之七——ANSI编码与代码页

一、ANSI编码

1.

如前所述,在全世界所有国家和地区的文字符号统一编码的UCS/Unicode编码方案问世之前(UCS、Unicode后文有详细介绍),各个国家、地区为了用计算机记录并显示自己的字符,都在ASCII编码方案的基础上,设计了各自的编码方案。

比如欧洲先后设计了EASCII和ISO/IEC 8859系列字符编码方案;为了显示中文及相关字符,中国设计了GB系列编码(“GB”为“国标”的汉语拼音首字母缩写,即“国家标准”之意)。

同样,日文、韩文以及其他世界各个国家和地区的文字都有它们各自的编码。所有这些各个国家和地区所独立制定的既兼容ASCII又互相之间不兼容的字符编码(准确地来说应该是既兼容ASCII又互相之间不完全兼容,因为这里所说的“不兼容”实际上指的是从整体中除开兼容ASCII之外的部分,下同,不再赘述),微软统称为ANSI编码。

所以,即使知道是ANSI编码,还需要知道这是哪一个国家或地区的才能解码;而且,同一份文本,只能采用一种ANSI编码方案来编码,比如,无法用同一种ANSI编码来表示既有汉字、又有韩文的文本。

2.

严格来说,ANSI的字面意思并非字符编码,而是美国的一个非营利组织——美国国家标准学会(American National Standards Institute)的缩写。ANSI这个组织做了很多标准制定工作,包括C语言规范ANSI C,还有与各国和地区既兼容ASCII又互相不兼容的字符编码相对应的“代码页(Code Page)”标准。(具体什么是代码页,以及代码页与ANSI编码之间的关系,详见下文第二节的介绍)

比如ANSI规定简体中文GB编码的代码页是936,所以GB编码又叫做ANSI Code Page 936(ANSI标准的代码页936)。

各国和地区既兼容ASCII又互相不兼容的字符编码之所以被微软 统称为ANSI编码的原因即在于此。

后来,或许是出于沿用统一的称呼之目的,有些在当时还并未被ANSI定为标准的代码页,也被微软称之为ANSI代码页,比如CP943代码页。

在Windows系统的编码处理中,ANSI编码一般代表系统默认的编码方式,而且并不是确定的某一种编码方式——在简体中文操作系统中ANSI编码默认指的是GB系列编码(GB2312、GBK、GB18030);在繁体中文操作系统中ANSI编码默认指的是Big5编码(港澳台地区使用的繁体汉字编码);在日文操作系统中ANSI编码默认指的是Shift JIS编码,等等。可在系统区域设置的系统Locale中查看、更改。(本文后面有详细介绍)

(笨笨阿林原创文章,转载请注明出处)

二、代码页(Code Page)

注:有关代码页的内容,网上资料较少,因此下面有关代码页的内容无法通过对多方资料来源的比对甄别以去芜存菁,错漏可能在所难免,还望多多指正。

1.

代码页的英文为Code Page,往往简称为CP。代码页也称为“内码表”,是计算机中与特定字符集(准确地说是字符集的某个字符编码方式CEF)相对应的一张字符编码对照表(这里的字符编码实际上指的是字符编码模式CES,因此实际为“字符-字节”或“字符-字节序列”对照表,详见后文)。

最初,IBM用代码页来称呼其计算机BIOS所支持的字符编码。当时通用的操作系统都是命令行界面的,这些操作系统直接使用BIOS提供的字符绘制功能来显示字符(或者是一组嵌入在显卡字符生成器中的字形)。这些BIOS代码页也被称为OEM代码页。

随着图形用户界面操作系统的广泛使用(最初被广为接受的图形用户界面操作系统是Windows 3.1),操作系统本身具有了字符绘制的功能。微软于是在Windows操作系统还没有转向UTF-16(UTF-16的推出要早于现在被广为认可的UTF-8)作为编码实现之前(即Windows2000发布之前),基于ANSI代码页标准定义了一系列支持ANSI编码的代码页,因而被称作“ANSI代码页”。代表性的是实现了ISO 8859-1(即Latin-1)的代码页1252(即CP1252),以及实现了GBK的代码页936(即CP936)。

现代操作系统中不同的语言和区域设置可能使用不同的代码页。

2.

除了上面提到的较为常见的ANSI代码页(即微软所采用的代码页标准),以及IBM代码页,其他有些商业巨头也制定有自己的代码页,比如Oracle代码页、SAP代码页,还有由多家公司联合制定的代码页,比如EUC代码页(EUC为Extended Unix Code的缩写,是由多家Unix系统开发公司针对Unix系统而联合制定的代码页,使用8位编码(即采用8位单字节码元)来表示字符,于1991年标准化。EUC现在主要用于Unix、Mac及Linux等类Unix系统中表示及储存汉语、日语及朝鲜语文字)。

后来代码页进一步扩展,除了原先针对ANSI编码所定义的ANSI代码页,针对Unicode字符集的各UTF编码方式(UTF-8、UTF-16、UTF-32等),各个组织和厂商往往也定义了相应的代码页。

另外,不同的组织或厂商,对于同一种编码方式往往使用各自不同的代码页名称(一般都以数字来进行命名区分)。例如,UTF-8在IBM称作代码页1208(即CP1208),在微软称作代码页65001(即CP65001),在SAP称作代码页4110(即CP4110);Windows使用936代码页(CP936)、Mac系统使用EUC-CN代码页来表示GBK编码(EUC-CN在类Unix系统中相当于GBK编码方案的别名,等同于Windows下的CP936代码页)。

(附:微软公司定义的代码页一览表:Code Page Identifiers - Windows applications)

3.

需要注意的是,在实践中,代码页一般与其所直接对应的字符集之间并非完全等同,往往因为种种原因(比如标准跟不上现实实践的需要)而会对字符集有所扩展。

例如,微软所采用的对应于ISO 8859-1字符集(即Latin-1字符集)的ANSI代码页1252(即CP1252),就对Latin-1字符集有所扩展,其中编码128~159也被定义了字符,这是与Latin-1字符集不同之处,用于表示英语和大多数欧洲语言(西班牙语和各种日耳曼/斯堪的纳维亚语)。另外,IBM所采用的对应于Shift JIS日文字符集的OEM代码页932(即CP932),也对Shift JIS有所扩展;而对应于Shift JIS字符集的微软ANSI代码页943(即CP943),也同样对Shift JIS有所扩展。

4.

代码页可以体现为从字符映射到单字节值或多字节值的一张表格

注意,针对ANSI编码而言,虽然其属于传统字符编码模型,但从现代字符编码模型的角度来看,这里所提到的单字节值与多字节值指的是特定于系统平台的物理意义上的字节序列,不是指与系统平台无关的逻辑意义上的码元序列(虽然对属于传统字符编码模型的早期字符编码方案而言,字符的码元序列与字节序列其实是一样的)。

而针对属于现代字符编码模型的Unicode字符集的各UTF编码方式而言,则更是同样如此。比如针对UTF-16所定义的代码页,其存储的是针对UTF-16这种字符编码方式CEF的某种字符编码模式CES(即大端序或小端序之一,大端序、小端序的概念后文有详细介绍)。

正因为这样,代码页也被称之内码表。

也就是说,代码页是字符集在计算机中的具体编码实现;特别是从现代字符编码模型的角度而言,代码页可认为是字符集的某种字符编码方式CEF的具体字符编码模式CES在计算机中的具体实现,可以将其理解为一张“字符-字节”(或更准确地理解为“字符-字节序列”)映射表,计算机通过查表实现“字符-字节”之间的双向“翻译”。

代码页主要用于具体实现各编码方案中的字符在计算机系统中的物理存储显示。当计算机读取了一个二进制字节,那这个字节到底属于哪个字符,就需要到存储在计算机中的某个代码页中查找,这个查找的过程就被称为查表

比如,当使用输入码(即外码)输入汉字时,输入法软件需要将输入码(出现重码时另加选择编号)根据代码页转换为机内码(即查表)进行存储,以及再根据机内码和相应的字体设定到对应的字体文件中查找字形码进行显示。

5.

在Windows中,代码页是系统默认设置的(即默认系统区域设置),也可在(Windows7的)“控制面板-区域和语言-管理-非Unicode程序的语言-更改系统区域设置”中选择列表中的语言进行更改。

注意,系统区域设置System Locale可用于确定在不使用Unicode编码的程序(即非Unicode程序)中输入和显示字符的默认编码方案(显然主要是指ANSI编码方案)和字体,这样就可以让非Unicode程序在计算机上使用指定的语言(实质上是使用指定的ANSI编码)得以正常运行。

因此,在计算机上安装某些非Unicode程序时,如果出现乱码,则可能需要更改默认的系统区域设置。为系统区域设置选择不同的语言并不会影响Windows系统本身或其他使用Unicode编码方案的程序(即Unicode程序)的语言显示。

但是,很显然,如果同一个操作系统中,多个非Unicode程序采用了各不相同的ANSI编码,则同一时间只有一种ANSI编码的非Unicode程序的语言显示是正常的,采用其他ANSI编码的非Unicode程序的语言显示为乱码;而同一个非Unicode程序是无法采用不同的ANSI编码的,比如同时采用中文和韩文,在非Unicode程序中是无法实现的,因为同一时间必定有其中之一是乱码的。

不过,现在Unicode编码方案已经成为了主流,非Unicode程序已经难得一见了。

(笨笨阿林原创文章,转载请注明出处)

三、微软Windows操作系统中ANSI代码页的设置

1.

微软为了适应世界上不同地区用户的文化背景和生活习惯,在Windows中设计了区域(Locale)设置的功能。

Locale是指特定于某个国家或地区的一组设定,包括代码页,以及数字、货币、时间和日期的格式等。

在Windows内部,其实有两个Locale设置:系统Locale和用户Locale。系统Locale决定代码页,用户Locale决定数字、货币、时间和日期的格式等。

可以在Windows控制面板的“区域和语言选项”中设置系统Locale(非Unicode程序的语言)和用户Locale(标准和格式)。如下图所示:

 

(Windows XP中的Locale设置)

(Windows 7中的Locale设置)

2.

系统Locale对应的代码页被作为Windows系统的默认代码页。在没有明确指定某个文本所采用的编码方案时,Windows系统将按照系统Locale中所指定的默认代码页(实质上代表了某个编码方案)来解释该文本数据。这个默认代码页通常被称作ANSI代码页(简称ACP;注意,如前所述,虽然非ANSI编码的Unicode各UTF编码也同样定义了代码页,但系统Locale中所设定的默认代码页之所以通常被称为ACP,是因为系统Locale主要是针对非Unicode程序而设置的)。

在Windows XP的“区域和语言选项”高级页面的“代码页转换表”中,可看到各种语言(实质上是各个编码方案)的代码页(但Windows7中已经不能直接看到了)。例如:

·874 (ANSI/OEM -泰文)

·932 (ANSI/OEM -日文Shift-JIS)

·936 (ANSI/OEM -简体中文GBK)

·949 (ANSI/OEM -韩文)

·950 (ANSI/OEM -繁体中文Big5)

·1250 (ANSI -中欧)

·1251 (ANSI -西里尔文)

·1252 (ANSI -拉丁文)

·1253 (ANSI -希腊文)

·1254 (ANSI -土耳其文)

·1255 (ANSI -希伯来文)

·1256 (ANSI -阿拉伯文)

·1257 (ANSI -波罗的海文)

·1258 (ANSI/OEM -越南)

(笨笨阿林原创文章,转载请注明出处)

 

预告:下一篇将开始正式讲解Unicode编码方案,敬请关注!】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angular 下拉搜索框实现

今天有个需求要写一个下拉搜索框&#xff0c;本来是下拉框的&#xff0c;由于内容太多&#xff0c;所以添加一个查找功能。根据博客进行改写的。参考了他的基本框架进行实现。 效果图&#xff1a; 输入框右边的白色箭头图片下载地址 <td>xxxxxxx</td> <td sty…

新手前端练手网站_编程到底难不难学?新手入门选择哪种语言好?

以下内容适合的读者&#xff1a;想要学习编程的小白一.编程到底难不难学&#xff1f;对于这个问题我的回答是不知道&#xff0c;学会了编程的人会说好学&#xff0c;中途就放弃的人会说很难&#xff0c;任何知识想要掌握好都不是一件容易的事情。所以我决定用自己的实际行动来证…

【转】刨根究底字符编码之八——Unicode编码方案概述

Unicode编码方案概述 1. 前面讲过&#xff0c;随着计算机发展到世界各地&#xff0c;于是各个国家和地区各自为政&#xff0c;搞出了很多既兼容ASCII但互相之间又不兼容的各种编码方案(微软统一称之为ANSI编码&#xff0c;具体体现为各种ANSI代码页)。 这样一来&#xff0c;同…

Angular 自定义属性指令-禁止input框输入空格-以及删除复制内容中的空格

创建一个ts文件&#xff0c;并在module.ts中定义 import { Directive, ElementRef, HostListener, Input } from angular/core; import { FormGroup, FormControl, NgControl } from angular/forms; Directive({selector: [input-noSpace]}) export class NoSpace {constructo…

基于androidx的快速开发框架_Vue企业级优雅实战07框架开发03封装基于MockJS的模拟数据...

预览本文的实现效果&#xff1a;# giteegit clone gitgitee.com:cloudyly/dscloudy-admin-single.git# githubgit clone gitgithub.com:cloudyly/dscloudy-admin-single.gitgit checkout 05_MockJS本文主要内容&#xff1a;基于 Mock JS&#xff0c;优雅设计网络请求的模拟数据…

【转】Net Framework,Net Core 和 Net Standard 区别

前几天我在一个群里看到有关这方面的讨论&#xff0c;最后感觉讨论的不是很清晰&#xff0c;有幸的是我们的项目去年就开始迁移NetCore的调研了&#xff0c;我个人多多少少也是有过这方面的研究。下面我将说一下我自己对着三个的认识如果有不足的地方&#xff0c;请大家指出。 …

记录一次SQL优化,增加索引,随便写的当笔记了

写了一个SQL&#xff0c;前端往返时间大约1.7秒&#xff0c;最终优化到一共150毫秒左右&#xff0c;应该还可以更好一些 下面说的有点乱&#xff0c;有空再好好总结一下吧。参考文章里面写的还是比较好的&#xff0c;只不过没有组合查询。 参考链接&#xff1a;https://zhuan…

使用函数求最大公约数 pta_高中数学选修教材2-导数第6课时《函数的单调性与导数》教学设计...

选修2-2第一章1.3.1 函数的单调性与导数一、先复习一下&#xff0c;上节课讲到了利用导数求曲线的切线方程(点我)&#xff0c;咱们这节课接着讲利用导数判断函数的单调性。二、做出图像形象生动&#xff0c;让学生看到当斜率为正(亦是导数为正)的时候函数图像是上升的&#xff…

java程序员_Java程序员工资为什么这么高?

众多行业中&#xff0c;程序员当然属于高薪职业。无论是国内还是国外&#xff0c;IT行业的程序员、工程师&#xff0c;甚至连码农都要比其他行业的从业者的收入高很多&#xff01;尤其是作为IT界的“常青树”Java&#xff0c;原因是什么&#xff1f;01Java行业市场需求存在巨大…

【转】深入浅出OOP(六): 理解C#的Enums

MSDN定义&#xff1a;枚举类型&#xff08;也称为枚举&#xff09;为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。 例如&#xff0c;假设您必须定义一个变量&#xff0c;该变量的值表示一周中的一天。 该变量只能存储七个有意义的值。 若要定义这些值&#xff…

usb接口供电不足_AMD RX 6000 系列显卡配备USB-C 接口,支持外接供电

IT之家 10 月 29 日消息 根据 AMD 的官方信息&#xff0c;新发布的 RX 6000 系列显卡进一步增强了显示能力&#xff0c;配备了 HDMI 2.1 接口、DP 1.4 接口和 USB-C 接口。AMD 表示&#xff0c;AMD Radeon 6000 系列显卡全部搭载 HDMI 2.1 VRR 接口&#xff0c;超大带宽支持最高…

【转】VS2005键盘布局_快捷键大全(总结了一些记忆的口诀)

VS快捷键对提高生产力有莫大帮助&#xff0c;本文将所有快捷键进行了重新整理归类&#xff0c;便于记忆。有缺失&#xff0c;不足之处&#xff0c;还请大家指出&#xff0c;谢谢 1、窗口快捷键 &#xff08;W代表Windows也就是窗口的意思&#xff09; CtrlW,A: 命令窗口&#…

mac securecrt程序无响应_如何重置mac上的系统管理控制器smc教程

虽然mac是一款十分高端的个人笔记本电脑&#xff0c;但是mac也会有出现故障的时候&#xff0c;比如风扇高速转动、键盘背光灯行为有些异常异常等等&#xff0c;那极有可能是你的系统管理控制器smc出现了问题&#xff0c;所以今天小编就来科普大家如何重置系统管理控制器smc。如…

bootstraptable treeGrid 懒加载_Java类加载机制及自定义加载器

一&#xff1a;ClassLoader类加载器&#xff0c;主要的作用是将class文件加载到jvm虚拟机中。jvm启动的时候&#xff0c;并不是一次性加载所有的类&#xff0c;而是根据需要动态去加载类&#xff0c;主要分为隐式加载和显示加载。隐式加载&#xff1a;程序代码中不通过调用Clas…

Idea打可执行jar包

前些日子试了下idea打包&#xff0c;有些细节没太注意所以经常打包失败&#xff0c;要不然就是显示没有主清单属性&#xff0c;所以一直用eclipse打包&#xff0c;今天又重新捣鼓了一下&#xff0c;写下过程&#xff1a; 1. 先添加需要打jar包的主入口 第三步一定不要放在main…

安卓系统挂载NTFS格式硬盘_Mac 读写 NTFS硬盘管理开源工具NTFSTool

NTFSTool是Mac OS 下一款开源的 NTFS 磁盘格式读写工具&#xff0c;基于Electron和VUE编写。遵守MIT开源协议。支持 NTFS 磁盘读写、挂载&#xff0c;退出、管理等功能。系统检测到插入移动硬盘后&#xff0c;会自动弹出 NTFSTool 界面&#xff0c;并自动挂载硬盘。安装NTFSToo…

【转】刨根究底字符编码之九——字符编码方案的演变与字节序

字符编码方案的演变与字节序 一、字符编码方案的演变 1. 根据前面的介绍&#xff0c;对于字符编码方案的演变&#xff0c;我们大致上可简单地划分为三个阶段&#xff1a; ① ASCII编码方案阶段 → ② ANSI编码方案阶段 → ③ Unicode/UCS编码方案阶段。 在第一个阶段的ASCII…

python人工智能_人工智能人才缺口千万!学Python抓住风口机会

前不久教育界的一个消息&#xff0c;引发了广泛的关注。今年9月&#xff0c;浙江三到九年级信息技术课将替换新教材&#xff0c;八年级将新增Python课程内容。新高一信息技术编程语言由VB替换为Python&#xff0c;大数据、人工智能、程序设计与算法按照教材规划五六年级开始接触…

【转】刨根究底字符编码之十——Unicode字符集的字符编码方式

一、字符编码方式CEF的选择 1. 由于Unicode字符集非常大(并且作为开放字符集还在不断扩展之中)&#xff0c;有些字符的编号(即码点值)需要两个或两个以上字节来表示&#xff0c;而要对这样的编号进行编码&#xff0c;也必须使用两个或两个以上字节。 比如&#xff0c;汉字“…