ANSI(American National Standards Institute):美国国家标准协会
ANSI编码
ANSI是什么编码?
刨根究底字符编码之七——ANSI编码与代码页
在全世界所有国家和地区的文字符号统一编码的UCS/Unicode编码方案问世之前(UCS、Unicode后文有详细介绍),各个国家、地区为了用计算机记录并显示自己的字符,都在ASCII编码方案的基础上,设计了各自的编码方案。
比如欧洲先后设计了EASCII和ISO/IEC 8859系列字符编码方案;为了显示中文及相关字符,中国设计了GB系列编码(“GB”为“国标”的汉语拼音首字母缩写,即“国家标准”之意)。
同样,日文、韩文以及其他世界各个国家和地区的文字都有它们各自的编码。所有这些各个国家和地区所独立制定的既兼容ASCII又互相之间不兼容的字符编码(准确地来说应该是既兼容ASCII又互相之间不完全兼容,因为这里所说的“不兼容”实际上指的是从整体中除开兼容ASCII之外的部分),微软统称为ANSI编码。
ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码。你的美国同事Bob的系统中ANSI编码其实是ASCII编码(ASCII编码不能表示汉字,所以汉字为乱码),而你的系统中(“汉字”正常显示)ANSI编码其实是GBK编码,而韩文系统中(“한국어”正常显示)ANSI编码其实是EUC-KR编码。
所以,即使知道是ANSI编码,还需要知道这是哪一个国家或地区的才能解码;而且,同一份文本,只能采用一种ANSI编码方案来编码,比如,无法用同一种ANSI编码来表示既有汉字、又有韩文的文本。
Q:那么Windows系统是如何区分ANSI背后的真实编码的呢?
A:微软用一个叫“Windows code pages”(在命令行下执行chcp命令可以查看当前code page的值)的值来判断系统默认编码,比如:简体中文的code page值为936(它表示GBK编码,win95之前表示GB2312,详见:Microsoft Windows’ Code Page 936),繁体中文的code page值为950(表示Big-5编码)。在命令提示符下,我们可以通过chcp命令来修改当前终端的active code page,从而来改变“ANSI编码”,但这种方式只在当前终端起作用。要想修改系统默认的“ANSI编码”,我们可以通过修改系统区域来实现(“控制面板” =>“时钟、语言和区域”=>“区域和语言”=>“管理”=>“更改系统区域设置…”)
Q:Linux又是如何区分的呢?
A:Linux的locale命令的LC_ALL
就是ANSI的真实编码,可以通过修改这个变量来修改真实编码,如export LC_ALL=zh_CN.GBK
ASCII编码
wiki-ASCII
ASCII:由ANSI制定的一套字符集(编码标准),主要用于显示英文。ASCII 是从电报码发展而来的,它的第一个商业用途是作为贝尔数据服务推广的七位电传打印机代码。
ASCII控制字符
百度百科-控制字符
ASCII的0-31和127是控制字符或通信专用字符等,是不可见的(其余是显示字符),用来控制使用 ASCII 的设备(例如打印机),或提供有关数据的元信息流,例如存储在磁带上的流
使用方式
- 基于ASCII的键盘上有个标为“Control”或”Ctrl”(有时也作”Cntl”)的键,与其他字母或符号键一起按下,就会触发控制字符功能
- 键盘上也有些单个键能产生控制码。例如标为“Backspace”的键通常产生编码8,“Tab”是编码9,“Enter”或“Return”是编码13(有些键盘上“Enter”可能是编码10)
控制字符被设计分为若干组:打印和显示控制、数据结构化、通信/传输控制、以及其他零散用途。
打印和显示控制字符最先用于控制作为最早的输出设备的打印机的物理机件。
- 回车(CR)意为将字符放置于纸边开始打印处(可能要移动到下一行,也可能不是)。
- 换行(LF)表示将下个字符放置于新行出现的方向上的下一行处(也可能同时要移动到行起始处,也可能不是)。
- 垂直和水平制表(VT/HT)则请求打印机将打印头移动到阅读方向上的下个制表位置。
- 换页(FF)则开始一张新纸。
- 退格(BS)将下个打印位置后退一个字符以便打印机可进行叠打而产生特殊字符(例如在文字下加下划线,在早期的字符打印机上是先打出文字后再用退格符将打印头退后,再叠打出下划线的)。
- 移入(SI)和移出(SO)用于选择替换的字符集、字体、下划线或其他打印模式,然而更常见的是使用其他的转义序列来实现这些目的。
- 响铃(BEL)就是一个简单的响声,用来使收到该字符的设备发出某种警告
通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等
随着不使用纸张打印、并在字符放置、删除等方面提供了更多灵活性的终端机的出现,打印控制码也进一步适应了这些变化。例如馈页表示清除屏幕而非馈送下一张白纸。人们设计了更复杂的转义序列来应用新终端和新打印机功能的优点。单个字符的控制码已经不够用来支持新外围设备的所有功能了,控制字符和转义序列之间的差别也开始变得模糊
有些控制码在计算机中依然可用,如下go代码
func main() {
fmt.Printf("%c", 65) // 打印A
fmt.Printf("%c", 10) // 换行
fmt.Printf("%c", 66) // 打印B
time.Sleep(time.Second) // 为看到退格效果,所以暂停一下
fmt.Printf("%c", 8) // 退格,光标回退到B位置
time.Sleep(time.Second) // 为看到退格效果,所以暂停一下
fmt.Printf("%c", 67) // 打印C,因为退格了,所以会覆盖B
fmt.Printf("%c", 7) // 响铃
}
转义序列
wiki-转义序列
有一些字符是打不出来的,比如换行,提示音,下一个制表位等等,于是程序语言的开发者就设计了转义序列
常见的 转义序列 形式/标准 有:ANSI转义序列、C/C++等编程语言转义序列
ANSI转义序列
wiki-ANSI转义序列
用于视频终端的转义序列,用来控制光标位置、字符色彩、样式等。现在,几乎所有的终端和终端模拟器都支持此标准。
(一个值得注意的例外是,在微软Windows 10更新TH2之前,Windows操作系统的Win32控制台是不支持ANSI转义序列的)
终端软件如vim的很多功能(比如翻页、回滚)就是用转义序列实现的
CSI-SGR
我们平时见的最多也用的最多的,用于彩色打印的,属于ANSI转义序列的CSI(Control Sequence Introducer) – 控制序列导入器中的SGR(Select Graphic Rendition) – 选择图形再现
其格式为0x1b[<n>m
,ox1b
是ESC的十六进制表示,也可以是033
(八进制表示)、27
(二进制表示)、"\033"
(字符串的八进制转义)、"\x1b"
(字符串的十六进制转义);<n>
是一系列用分号分隔的数字,如1;2;3
例如
echo -e "\x1b[31m我是一个红色字符串"
具体可见wiki-ANSI转义序列-选择图形再现
编程语言转义序列
今天的文章a的ansi编码_合法转义字符怎么判断[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/81528.html