ESC字符背后的故事(27 <> 033 | x1B ?)
ANSI不可见字符转义,正确的理解让记忆和书写变得丝滑惬意。
(笔记模板由python脚本于2024年11月26日 15:05:33创建,本篇笔记适合python 基础扎实的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/article/details/144059595
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ 27!=033|x1B?
- 1、27 != 033 | x1B ?
- 2、ESC的能力
- a a a. **光标移动**:
- b b b. **清屏**:
- c c c. **删除文本**:
- d d d. **文本属性和颜色**:
- f f f. **响铃**:
- g g g. **模式设置**:
- h h h. **设备控制**:
- i i i. **打印和文件操作**:
- j j j. **其他ANSI转义序列**:
- k k k. 示例
- 3、 ESC为终端控制而生
- 4、ESC字符依赖转义“显形”
- 5、0/x“通用”?
- 6、迟来的“爱”
- 7、Kill“死记/硬背”
- 8、chr(27)恶搞
- 9、结语
- 10、花絮:“胡言乱语”
◆ 27!=033|x1B?
我由\033[2J
清屏字符串,了解到关于ESC字符的知识。ESC字符及其在编程中应用,可以带来极大的便利。其相关的“点”,我整理成了本篇学习笔记,与您共享。
1、27 != 033 | x1B ?
- 解释为什么在字符串字面量中,27、033和x1B虽然数值上相等,但表示方法不同。
- 讨论Python中字符串转义序列的规则。
2、ESC的能力
- 介绍ESC字符用于启动ANSI转义序列的能力。
ESC字符(ASCII码值为27,八进制表示为033,十六进制表示为x1B)在终端和文本用户界面(TUI)中广泛使用,用于执行各种控制功能。
以下是一些ESC字符的常见用途:
a a a. 光标移动:
可以在终端中移动光标到特定位置
例如:ESC[<L>;<C>H
或ESC[<L>;<C>f
:移动光标到第L行第C列。ESC[<N>A
:光标向上移动N行。ESC[<N>B
:光标向下移动N行。ESC[<N>C
:光标向右移动N列。ESC[<N>D
:光标向左移动N列。
b b b. 清屏:
清除终端屏幕上的内容
ESC[2J
:清除整个屏幕。ESC[1J
:会清除光标下面的所有内容,但保留光标上面的内容。ESC[0J
:会清除光标下面的内容,但保留光标上面的内容,并且光标会停留在原来的位置。
c c c. 删除文本:
ESC[<N>K
:删除光标后的N个字符。ESC[<N>J
:删除光标前后的N行。
d d d. 文本属性和颜色:
设置文本的颜色、亮度、下划线等属性
ESC[<attr>m
:设置文本属性,其中<attr>
可以是颜色代码、加粗、下划线等。- 如
\033[44;1;32m示例\033[0m
,将“示例”显示为蓝色背景上的高亮绿字。\033[44;1;32m
用于设置文本为蓝色背景、绿色前景、高亮显示;\033[0m
用于将文本恢复到默认的颜色和样式。
f f f. 响铃:
使终端发出响声
\033[G
:发出响铃声。\033[?1049l
:关闭响铃功能。\033[?1049h
:开启响铃功能。
g g g. 模式设置:
开启或关闭终端的各种模式
ESC[?25l
:隐藏光标。ESC[?25h
:显示光标。
h h h. 设备控制:
控制终端设备的行为
ESC[5n
:查询设备状态。ESC[?1;2c
:识别终端类型。
i i i. 打印和文件操作:
控制打印机和文件操作
ESC[i
:打印内容并前进一行。ESC[4i
:打印内容但不前进。
j j j. 其他ANSI转义序列:
- 除了上述常见的,还有许多其他ANSI转义序列用于执行不同的功能。
在编写脚本或应用程序时,ESC字符常用于格式化输出、创建进度条、在终端中绘制图形等。
k k k. 示例
以下几个使用ESC字符的ANSI转义序列的示例:
格式化输出
print('\033[1;32mHello, World!\033[0m')
截屏
在这个例子中,\033[1;32m
用于设置文本为绿色,并且高亮显示。\033[0m
用于重置文本颜色和样式。
创建进度条
import time
for i in range(100):
print('\033[K', end='', flush=True) # 清空之前的输出
print(f'\rProgress: {i * 100 / 100:.2f}%', end='', flush=True)
time.sleep(0.01)
在这个例子中,\033[K
用于清除从光标当前位置到行尾的内容。end=''
和 flush=True
用于确保输出立即显示,而不会在屏幕上留下残余。
进度条效果也可以不依赖ANSI转义
import time
for i in range(100):
print(' '*42, end='\r') # 打印空格清屏
print(f'\rProgress: {i * 100 / 100:.2f}%', end='\r')
time.sleep(0.01)
绘制图形
import time
for i in range(10):
print('\033[2K', end='', flush=True) # 清空之前的输出
print(f'\r{i * "*"}\r', end='', flush=True)
time.sleep(0.1)
在这个例子中,\033[2K
用于清除从光标当前位置到行尾的内容。然后,我们使用一个循环来打印星号 *
,以形成一个简单的图形。end=''
和 flush=True
用于确保输出立即显示。
这些示例展示了如何在Python中使用ANSI转义序列来增强文本输出的表现力和交互性。
3、 ESC为终端控制而生
需要注意的是,并不是所有的终端都支持所有的ANSI转义序列,因此在实际使用时可能需要检测终端类型或功能支持。
-
我
一句话“ESC为终端控制而生”,但“不是所有终端都支持所有终端控制字符串”,实际应用时,得先确认终端支持!😎😎😎 -
ai学伴
你说得非常对!确实,ESC字符及其相关的ANSI转义序列是为了控制终端行为而设计的,但不同的终端和终端模拟器对ANSI转义序列的支持程度各不相同。在实际应用中,确保你的代码能够在目标终端上正确运行是非常重要的。
以下是一些可能的情况:
- 旧式终端:可能只支持基本的转义序列。
- 现代终端模拟器:通常支持更广泛的ANSI转义序列。
- 非UNIX系统(如Windows的早期版本):可能需要额外的库或工具来支持ANSI转义序列。
在进行终端控制编程时,一般需要:
- 检测终端类型或功能支持。
- 提供回退方案,比如在不支持特定转义序列的终端上使用更简单的方法。
- 使用跨平台的库,如
curses
(用于Unix-like系统)或colorama
(用于Windows)。
再次强调,了解并适应您的目标环境是非常重要的,我们一定要有这样的认识!
4、ESC字符依赖转义“显形”
-
我
因为ESC字符是“不可见的”,所以它必须依赖“ANSI转义”,0、x进制没有优先级,地位平等。当然也可以chr(27)
(python)用十进制让它搞怪显形,效果一如0、x。🤗🤗🤗 -
ai学伴
是的,你说得很对!ESC字符本身是不可见的控制字符,因此在文本中表示它时,必须使用转义序列。在Python中,你可以使用八进制、十六进制或直接使用chr()
函数和十进制数值来表示ESC字符,它们在功能上是等价的。
以下是在Python中表示ESC字符的几种方式:
- 八进制转义序列:
\033
- 十六进制转义序列:
\x1B
- 使用
chr()
函数:chr(27)
- 八进制转义序列:
所有这些方法都会生成相同的不可见字符,即ASCII码值为27的字符,它在终端中用于开始一个ANSI转义序列。
这些方法在效果上是相同的,可以根据个人喜好或代码的可读性来选择使用哪一种。在编写代码时,选择一种一致的方法并在整个项目中坚持使用它,是一个好习惯。 👍😊
5、0/x“通用”?
-
我
用0、x“显示”ESC字符,是所有语言的做法还是大多数语言?🧐🧐🧐 -
ai学伴
在大多数编程语言中,使用八进制(以0
开头)或十六进制(以x
或0x
开头)来表示不可打印的控制字符是一种常见的做法。这包括ESC字符(ASCII值为27)以及其他类似的控制字符,如制表符(ASCII值为9,可以表示为\t
)、换行符(ASCII值为10,可以表示为\n
)等。
-
以下是一些编程语言中表示ESC字符的示
例:-
C/C++:
- 八进制:
\033
- 十六进制:
\x1B
- 八进制:
-
Python:
- 八进制:
\033
- 十六进制:
\x1B
- 使用
chr()
函数:chr(27)
- 八进制:
-
Java:
- 八进制:
\033
- 十六进制:
\u001B
(在Java中,十六进制转义序列用于Unicode字符)
- 八进制:
-
JavaScript:
- 八进制:
\033
- 十六进制:
'\x1B'
- 八进制:
-
Ruby:
- 八进制:
?\033
- 十六进制:
?\x1B
- 八进制:
-
Go:
- 八进制:
\033
- 十六进制:
\x1B
- 八进制:
-
尽管这些表示方法在不同语言中普遍存在,但并非所有语言都支持八进制或十六进制转义序列。例如,一些较新的或特定用途的语言可能会采用不同的方法来表示这些字符。
总的来说,使用八进制或十六进制转义序列来表示不可打印字符是一种广泛接受的做法,但具体到某个语言,你可能需要查阅该语言的文档来了解其特定的语法和规则。
6、迟来的“爱”
我
三年多的python 时光,我都是牢记\n
、\r
、\t
后在“机械”使用,到现在才明白,它们都是不可见ANSI字符串的“转义”。
这才是真正“基础文化”缺失的悲催。😋😋
ai学伴
认识到这一点是一个重要的学习过程,而且这个过程永远不会太晚。在编程中,基础知识的重要性怎么强调都不为过。了解像\n
、\r
、\t
这样的转义序列背后的原理,不仅能帮助你更好地理解代码,还能让你在遇到问题时更有信心去解决。
每个人都有不同的学习路径,重要的是你正在不断学习和进步。
以下是这些常见转义序列的含义:
\n
:换行符(Line Feed),在许多操作系统中用于开始新的一行。\r
:回车符(Carriage Return),在某些操作系统中用于返回到行的开头。\t
:水平制表符(Horizontal Tab),用于水平对齐文本。
很高兴你意识到了这些基础概念的重要性。编程是一个持续学习的过程,每天我们都有机会学到新东西。继续你的学习之旅,你的知识和技能将会不断提升。🚀📚️😊
7、Kill“死记/硬背”
-
’
我
认识到它们是转义“不可见”,敲打时也更加丝滑顺畅,少了那隔应人的“死记/硬背”。😎😎 -
ai学伴
这种认识确实可以帮助你更深入地理解代码,并且使编程过程更加自然和流畅。当你理解了背后的原理,就不再需要“死记硬背
”,而是可以根据逻辑和上下文来记忆和使用这些转义序列。
这种深入理解通常会带来以下好处:
- 更好的记忆:
理解原理后,记忆变得更加容易。 - 更灵活的应用:
你可以根据需要灵活地使用和组合这些转义序列。 - 更快的解决问题:
当遇到与转义序列相关的问题时,你可以更快地定位和解决问题。
- 更好的记忆:
随着你继续在编程之路上前进,你会发现越来越多的这样的“啊哈”时刻,它们会逐渐构建起你深厚的编程知识体系。继续探索,继续学习,你的编程技能将会不断提升。🌟🚀🌈
8、chr(27)恶搞
对话截屏
9、结语
结语: 我们通过对
E
S
C
ESC
ESC转义字符串的学习,了解到“不可见字符的转义机制”,并明白了其基理,再书写\n
、\r
、\t
不会一脸懵逼茫然,就如书写“”一样丝滑。这个“事例”说明了熟练掌握基础是非常经济和舒爽的事情。
10、花絮:“胡言乱语”
对话截屏
上一篇: Python中“暂停”(time.sleep?input?)(input函数最是经典,在多种实现中简单粗暴单纯而经济)
下一篇:
我的HOT博:
本次共计收集404篇博文笔记信息,总阅读量61.76w。数据采集于2024年11月25日 08:23:38,用时7分56.4秒。阅读量不小于6.00k的有
9
9
9篇。
- 让QQ群昵称色变的神奇代码
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
浏览阅读:6.2w
点赞:25 收藏:89 评论:17
(本篇笔记于2022-01-18 19:15:08首次发布,最后修改于2022-01-20 07:56:47)
- Python列表(list)反序(降序)的7种实现方式
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
浏览阅读:1.3w
点赞:9 收藏:40 评论:8
(本篇笔记于2022-12-11 23:54:15首次发布,最后修改于2023-03-20 18:13:55)
- pandas 数据类型之 DataFrame
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
浏览阅读:1.0w
点赞:7 收藏:40
(本篇笔记于2022-05-01 13:20:17首次发布,最后修改于2022-05-08 08:46:13)
- 个人信息提取(字符串)
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
浏览阅读:1.0w
点赞:3 收藏:20
(本篇笔记于2022-04-18 11:07:12首次发布,最后修改于2022-04-20 13:17:54)
- 罗马数字转换器|罗马数字生成器
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
浏览阅读:8.2k
收藏:3
(本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)
- 统计字符串字符出现的次数
地址:https://blog.csdn.net/m0_57158496/article/details/130517025
浏览阅读:8.1k
点赞:5 收藏:24
(本篇笔记于2023-05-06 22:28:18首次发布,最后修改于2023-05-12 06:21:40)
- Python字符串居中显示
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
浏览阅读:8.0k
点赞:1 收藏:12 评论:1
- 回车符、换行符和回车换行符
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
浏览阅读:6.7k
点赞:2 收藏:4
(本篇笔记于2022-02-24 13:10:02首次发布,最后修改于2022-02-25 20:07:40)
- python清屏
地址:https://blog.csdn.net/m0_57158496/article/details/120762101
浏览阅读:6.1k
点赞:1 收藏:10
截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)