python文不如字之开篇之作PILtkinterpygame和CMD命令行实战演示字符字符集字符编码知识

Posted dhjabc_1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python文不如字之开篇之作PILtkinterpygame和CMD命令行实战演示字符字符集字符编码知识相关的知识,希望对你有一定的参考价值。

【文不如字之开篇之作】字符、字符集、字符编码基础知识宣贯篇

字符集和字符编码 —— 每个软件开发人员应该无条件掌握的知识!

文章目录

一、基础知识

(一)字符

字符指类字形单位或符号,包括中文、字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。

字符是电子计算机或无线电通信中字母、数字、符号的统称,其是数据结构中最小的数据存取单位,通常由8个二进制位(一个字节)来表示一个字符。
字符是计算机中经常用到的二进制编码形式,也是计算机中最常用到的信息形式。

(二)字符集

字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

(三)字符编码

字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。

在 ASCII 编码中,一个英文字母字符存储需要1个字节。
在 GB 2312 编码或 GBK编码中,一个汉字字符存储需要2个字节。
在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。
在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节。
在UTF-32编码中,世界上任何字符的存储都需要4个字节。

(四)字符集和字符编码的关系

字符集是书写系统字母与符号的集合,而字符编码则是将字符映射为一特定的字节或字节序列,是一种规则。通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码(例如:ASCII、ios-8859-1、GB2312、GBK,都是即表示了字符集又表示了对应的字符编码,但Unicode不是,它采用现代的模型)),因此基本上可以将两者视为同义词。

二、常用字符集和字符编码

常见字符集名称:
ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

(一)ASCII字符集&编码

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以勉强显示其他西欧语言。它是现今最通用的单字节编码系统(但是有被Unicode追上的迹象),并等同于国际标准ISO/IEC 646。

ASCII字符集:主要包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
ASCII编码:将ASCII字符集转换为计算机可以接受的数字系统的数的规则。使用7位(bits)表示一个字符,共128字符;但是7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。

(二)GBXXXX字符集&编码

1、GB2312

GB2312是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——*本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312 规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。

GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。

2、GBK

GB2312 仅收汉字 6763 个,这大大少于现有汉字,随着时间推移及汉字文化的不断延伸推广,有些原来很少用的字,现在变成了常用字,未收入 GB2312-80,这使得表示、存储、输入、处理都非常不方便,而且这种表示没有统一标准。
为了解决这些问题,以及配合UNICODE的实施,全国信息技术化技术委员会于1995年12月1日《汉字内码扩展规范》。

GBK向下与GB2312 完全兼容,向上支持ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。

GBK亦采用双字节表示,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1,总体编码范围为8140-FEFE之间,首字节在81-FE 之间,尾字节在40-FE 之间,剔除 XX7F 一条线。

GBK 共收入21886个汉字和图形符号,包括:
GB2312中的全部汉字、非汉字符号;
BIG5中的全部汉字; 与ISO
10646相应的国家标准GB13000中的其它 CJK 汉字,以上合计20902个汉字;
其它汉字、部首、符号,共计984个;

3、GB18030

GB18030 是最新的汉字编码字符集的国家标准,向下兼容 GBK 和 GB2312 标准。GB18030 编码是一二四字节变长编码。一字节部分从 0x0~0x7F 与 ASCII 编码兼容。二字节部分,首字节从 0x81~0xFE,尾字节从 0x40~0x7E以及 0x80~0xFE,与GBK标准*本兼容。四字节部分,第一字节从 0x81~0xFE,第二字节从 0x30~0x39,第三和第四字节的范围和前两个字节分别相同。四字节部分覆盖了从 0x0080 开始, 除去二字节部分已经覆盖的所有 Unicode 3.1码位。

GB18030编码在码位空间上做到了与Unicode标准一一对应,这一点与UTF-8编码类似。

(三)Unicode字符集&UTF编码

当计算机传到世界各个国家时,为了适合当地语言和字符,设计和实现类似GB232/GBK/GB18030/BIG5的编码方案。这样各搞一套,在本地使用没有问题,一旦出现在网络中,由于不兼容,互相访问就出现了乱码现象。

为了解决这个问题,一个伟大的创想产生了——Unicode。Unicode编码系统为表达任意语言的任意字符而设计。

它使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph)。 每个数字代表唯一的至少在某种语言中使用的符号。
每个字符对应一个数字,每个数字对应一个字符。即不存在二义性。不再需要记录"模式"了。

在计算机科学领域中,Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,它可以使电脑得以体现世界上数十种文字的系统。Unicode 是基于通用字符集(Universal Character Set)的标准来发展,Unicode 就已经包含了超过十万个字符、一组可用以作为视觉参考的代码图表、一套编码方法与一组标准字符编码、一套包含了上标字、下标字等字符特性的枚举等。

Unicode 组织(The Unicode Consortium)是由一个非营利性的机构所运作,并主导 Unicode 的后续发展,其目标在于:将既有的字符编码方案以Unicode 编码方案来加以取代,特别是既有的方案在多语环境下,皆仅有有限的空间以及不兼容的问题。

1、Unicode

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符。Unicode只是一个符号集, 它只规定了符号的二进制代码, 却没有规定这个二进制代码应该如何存储。比如UTF-8、UTF-16、UTF-32都是Unicode编码的实现方式,不过UTF-8是使用最多的实现。

Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。

2、UTF-8

UTF-8 :UTF-8 中的代码单元由 8 位组成;在 UTF-8
中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元;

UTF-8:被定义为将代码点编码为1至4个字节,具体取决于代码点数值中有效位的数量。

前128个字符(US-ASCII)需要一个字节。接下来的1,920个字符需要两个字节进行编码,其中涵盖了几乎所有拉丁字母字母的其余部分,还包括希腊语,西里尔语,科普特语,亚美尼亚语,希伯来语,阿拉伯语,叙利亚语,塔那那语和N’Ko字母以及组合变音词马克。剩余基本多语言平面中的字符需要三个字节,其中几乎包含所有常用字符,包括大多数字符中文,日文和韩文字符。Unicode的其他平面中的字符需要四个字节,其中包括不常见的CJK字符,各种历史脚本,数学符号和表情符号(象形符号)。
注意:虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是 最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包 含了很多的英文字符。

3、UTF-16

UTF-16 :UTF-16 中的代码单元由 16 位组成;UTF-16 的代码单元大小是 8 位代码单元的两倍。所以,标量值小于 U+10000 的代码点被编码到单个代码单元中;

4、UTF-32

UTF-32:UTF-32 中的代码单元由 32 位组成; UTF-32 中使用的 32 位代码单元足够大,每个代码点都可编码为单个代码单元;

(四)GBK编码和UTF-8编码关系

目前国内一些发行的WEB开源框架,都提供这两种编码格式。
不过既然UTF-8是世界通用的,支持全世界的字符编码;为什么还有人选择使用GBK这种主要为针对中文的编码格式?

中文领域GBK比UTF-8存储小
GBK是字节结构定长的编码;每个字符占用两个字节的编码,并收录了基本能接触到的所有中文字,和其他部分字符的扩充。
UTF-8可变多字节编码;多数中文字符都会占用不小于两个字节的编码。

所以如果软件不考虑兼容国外字符的话,使用GBK会减少代码传输和代码存储。

(五)简单小结

1、ASCII用于表示英文字符,是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符;
2、GB2312简体中文的编码格式,只支持6763个常用汉字;
3、GBK是GB2312*础上扩容后兼容GB2312的标准,包含全部中文字符,支持简体中文及繁体中文;
4、GBK通用性比UTF8差,不过UTF8占用的数据库比GBK大; GB2312、GBK到GB18030都属于双字节字符集 (DBCS);
5、从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0;

三、字符的相关属性


这个字体为:宋体,颜色为:黑色,大小为:166px。

(一)字体


ppt里面有很多的字体,从列表中可以看出,我们在使用中可以使用默认字体,也可以自己下载ttf文件安装新的字体

(二)颜色


颜色框里有各种颜色,可以使用RGB模式、也可以使用HLR模式等等。
而且在代码中可以通过随机数生成需要的颜色、或者自定义想要的颜色。

(三)大小

可以自定义字体大小、一般用的比较多的都是10-30px的字体大小。

好的,上面介绍了基础知识,那么下面开始进入代码环节,欢迎继续往下看。

四、pygame库中处理字符

(一)get_fonts函数

pygame中有一个方法叫做get_fonts(),该方法的返回值是一个列表,列表存储的是系统中所有的字体文件名称。
通过这段代码输出系统中所有字体文件的名称

import pygame
font_list = pygame.font.get_fonts()
print(len(font_list))
print(font_list)

输出结果如下:

可以看到有200多种默认字体可以选择。

(二)查找字体

import pygame
font_list = pygame.font.get_fonts()
print(len(font_list))
print(font_list)
# 查找字体位置
print(font_list.index('microsoftjhengheimicrosoftjhengheiui'))
print(font_list.index('simsun'))

输出结果如下:

可以看到:microsoftjhengheimicrosoftjhengheiui这个微软简体,为默认字体,可以显示中文,而另外一个字体simsum则不是默认字体,所以无法查询到。

这里使用的是list列表查找字符串元素的方法index来定位位置。

(三)SysFont函数

使用系统自带的字体: my_font = pygame.font.SysFont("arial", 16)

(四)Font函数

使用自定义的字体: my_font = pygame.font.Font("simsun.ttf", 16)

第一个参数是字体名,第二个自然就是大小.

(五)render函数

text_surface = my_font.render("hello python", True, (0,0,0), (255, 255, 255))

第一个参数是写的文字;
第二个参数是个布尔值,以为这是否开启抗锯齿,就是说True的话字体会比较平滑,不过相应的速度有一点点影响;
第三个参数是字体的颜色;
第四个是背景色,如果你想没有背景色(也就是透明),那么可以不加这第四个参数。

(六)显示中文

如何显示中文, 首先你得用一个可以使用中文的字体,宋体、黑体什么的,或者你直接用中文TTF文件,然后文字使用unicode,即u”中文的文字”这种。

(七)字符显示过程

创建了一个font对象,你就可以使用render方法来写字了,然后就能blit到屏幕上

实现一个简单案例:

import sys, pygame
import os
import random
import time

pygame.init()  # 初始化pygame类
screen = pygame.display.set_mode((600, 600))  # 设置窗口大小
pygame.display.set_caption('python系列之文不如字')  # 设置窗口标题
tick = pygame.time.Clock()
fps = 10  # 设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or event.type == pygame.K_F1:
            pygame.quit()
            sys.exit()
    screen.fill((0, 0, 0))  # 设置背景为白色
    info = pygame.font.SysFont("arial", 25)
    info_fmt = info.render("祝我们健康快乐", True, (255, 255, 255))
    screen.blit(info_fmt, (100, 250))
    fcclock.tick(fps)
    pygame.display.flip()  # 刷新窗口


显示结果乱码了,无法正常显示中文字符

(八)解决中文乱码问题

使用能显示中文的默认字库,如这里选择microsoftjhengheimicrosoftjhengheiui这个微软简体
修改为:

info = pygame.font.SysFont("microsoftjhengheimicrosoftjhengheiui", 25) 

显示效果如下:

(九)使用Font函数构建字符

import sys, pygame
import os
import random
import time

pygame.init()  # 初始化pygame类
screen = pygame.display.set_mode((600, 600))  # 设置窗口大小
pygame.display.set_caption('python系列之文不如字')  # 设置窗口标题
tick = pygame.time.Clock()
fps = 10  # 设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or event.type == pygame.K_F1:
            pygame.quit()
            sys.exit()
    screen.fill((0, 0, 0))  # 设置背景为白色
    font1 = pygame.font.Font(r'C:\\Windows\\Fonts\\simsun.ttc', 32)
    info_fmt = font1.render("祝我们健康快乐", True, (255, 255, 255))
    print(font1.size("祝我们健康快乐"))
    # screen.blit(info_fmt, (100, 250))
    fcclock.tick(fps)
    pygame.display.flip()  # 刷新窗口

(十)Font对象的其他方法

方法名称方法说明
pygame.font.Font.size()确定多大的空间用于表示文本
pygame.font.Font.set_underline()控制文本是否用下划线渲染
pygame.font.Font.get_underline()检查文本是否绘制下划线
pygame.font.Font.set_bold()启动粗体字渲染
pygame.font.Font.get_bold()检查文本是否使用粗体渲染
pygame.font.Font.set_italic()启动斜体字渲染
pygame.font.Font.metrics()获取字符串参数每个字符的参数
pygame.font.Font.get_italic()检查文本是否使用斜体渲染
pygame.font.Font.get_linesize()获取字体文本的行高
pygame.font.Font.get_height()获取字体的高度
pygame.font.Font.get_ascent()获取字体顶端到基准线的距离
pygame.font.Font.get_descent()获取字体底端到基准线的距离
import sys, pygame
import os
import random
import time

pygame.init()  # 初始化pygame类
screen = pygame.display.set_mode((300, 300))  # 设置窗口大小
pygame.display.set_caption('python系列之文不如字')  # 设置窗口标题
tick = pygame.time.Clock()
fps = 10  # 设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or event.type == pygame.K_F1:
            pygame.quit()
            sys.exit()
    screen.fill((224, 224, 224))  # 设置背景为白色
    font1 = pygame.font.Font(r'C:\\Windows\\Fonts\\禹卫书法行书简体.ttf', 32)
    font1.set_bold(True)
    font1.set_underline(True)
    info_fmt = font1.render(u'祝我们健康快乐', True, (255, 0, 128))
    print(font1.get_bold())
    screen.blit(info_fmt, (0, 100))
    fcclock.tick(fps)
    pygame.display.flip()  # 刷新窗口

(十一)save成图片

import sys, pygame
import os
import random
import time

pygame.init()  # 初始化pygame类
screen = pygame.display.set_mode((300, 300))  # 设置窗口大小
pygame.display.set_caption('python系列之文不如字')  # 设置窗口标题
screen.fill((224, 224, 224))  # 设置背景为白色
font1 = pygame.font.Font(r'C:\\Windows\\Fonts\\禹卫书法行书简体.ttf', 32)
font1.set_bold(True)
font1.set_underline(True)
info_fmt = font1.render(u'祝我们健康快乐', True, (255, 0, 128))
screen.blit(info_fmt, (0, 100))
pygame.image.save(screen, 'font.png')

输出结果

五、PIL库中处理字符

绘制文字和绘制图形是一样的。

(一)英文输出

函数draw.text(xy, text, fill)

xy:起点坐标
text:绘制的文本
fill:填充色。"red""blue"...
...其中绘制文字还有许多其它参数

“”"
使用示例

from PIL import Image, ImageDraw, ImageFont
# 创建一个图像用于绘制文字
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
# 获取字体对象
imFont = ImageFont.truetype('simkai.ttf', 30)
# 绘制文字时设置字体
drawer.text((50, 100),text="hello world",font=imFont,fill="red")
im.show()

(二)中文输出

from PIL import Image, ImageDraw, ImageFont
# 创建一个图像用于绘制文字
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
# 获取字体对象
imFont = ImageFont.truetype('simkai.ttf', 30)
# 绘制文字时设置字体
drawer.text((50, 100),text="祝我们健康快乐",font=imFont,fill="red")
im.show()

六、tkinter库中处理字符

Tkinter 是 Python 标准 GUI 库,其最初是为 Tcl(这是一门工具命令语言,而不是某个电视机品牌)设计的,由于其良好的可移植性和灵活性,加上非常容易使用,因此逐渐被移植到很多脚本语言中,包括 Perl、Ruby 和 Python。 本章就来重点介绍Tkinter库。由于它是 Python 自带的 GUI 库,因此无须进行额外的下载安装,只要导入 tkinter 包即可。

(一)标签(Label)的颜色、字体和大小

#导入tkinter库,并设置别名为tk
import tkinter as tk
# 创建Tk对象,Tk代表窗口
root =tk.Tk()
# 设置窗口标题
root.title('入门案例')
# 创建Label对象,第一个参数指定该Label放入root
w =tk.Label(root, text="Hello Python!",fg='blue',font=("微软雅黑",40))
# 调用pack进行布局
w.pack()
# 启动主窗口的消息循环
root.mainloop()

通过关键代码实现字符的大小、颜色和字体类型

w =tk.Label(root, text="Hello Python!",fg='blue',font=("微软雅黑",40))

输出效果:

(二)entry文本框显示

from tkinter import *

root =Tk()
root.title("tk文本框演示")
root.geometry('400x200')

text =Text(root, height=12, width=60,
            foreground='darkgray',
            font=('微软雅黑',36),
            spacing2=8,# 设置行间距
            spacing3=12)# 设置段间距
text.pack(fill=BOTH,expand=Y)

root.mainloop()

绘制文字的代码:

text =Text(root, height=12, width=60,
            foreground='darkgray',
            font=('微软雅黑',36),
            spacing2=8,# 设置行间距
            spacing3=12)# 设置段间距

显示效果:

(三)canvas绘制文字

from tkinter import *

def main():
    root = Tk()
    w = Canvas(
        root,
        width=200,
        height=200,
        background="white"
    )
    w.pack()
    w.create_text(100, 50, text='祝我们健康快乐')
    mainloop()

if __name__ == '__main__':
    main()

绘制文字的代码:

w.create_text(100, 50, text='祝我们健康快乐')

输出效果:

七、CMD命令行中处理字符

(一)实现过程

终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。
转义序列是以ESC开头,即用\\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示就是033)。

(二)格式要求

开头部分:\\033[显示方式;前景色;背景色m + 结尾部分:\\033[0m
注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个;另外由于表示三个参数不同含义的数值都是唯一的没有重复的,所以三个参数的书写先后顺序没有固定要求,系统都能识别;但是,建议按照默认的格式规范书写。
对于结尾部分,其实也可以省略,但是为了书写规范,建议\\033[***开头,\\033[0m结尾。

(三)参数含义:

显示方式: 0(

以上是关于python文不如字之开篇之作PILtkinterpygame和CMD命令行实战演示字符字符集字符编码知识的主要内容,如果未能解决你的问题,请参考以下文章

python文不如字之开篇之作PILtkinterpygame和CMD命令行实战演示字符字符集字符编码知识

python使用tkinter实现透明窗体的开篇之作-基础框架介绍

垃圾回收开篇之作,带你走进 JVM 垃圾回收机制

585页Python编程快速上手,重实操的经典之作!

Swift5之开篇

“厚德载物”是哪几德,做事先学做人——我读过的最好的为人处世之作