阅读后,您可以为支付宝付款,并要求作者喝咖啡. 如有任何疑问,请加入微信小组讨论:

电脑杂谈  发布时间:2020-07-29 16:04:28  来源:网络整理

字符串_首行缩进2字符显示3字符_将字符数组a复制到字符数组b

我们已经提到字符串也是一种数据类型. 但是,字符串的特点是存在编码问题.

因为计算机只能处理数字,所以如果要处理文本,则必须先将文本转换为数字,然后才能进行处理. 最早的计算机在设计中使用8位作为字节. 因此,一个字节可以代表的最大整数是255(二进制11111111 =十进制255). 如果要表示一个较大的整数,则必须使用更多的字节. 例如,可以用两个字节表示的最大整数是65535,可以用4个字节表示的最大整数是4294967295.

由于计算机是美国人发明的,最早只有127个字符被编码到计算机中,即大写和小写英文字母字符串,数字和一些符号. 该编码表称为ASCII编码,例如大写字母A. 代码为65,小写字母z的代码为122.

但是显然一个字节不足以处理中文. 至少需要两个字节,并且它不能与ASCII编码冲突. 因此,中国已开发出GB2312编码以合并中文.

您可以想象的是,世界上有数百种语言. 日本将日文编译为Shift_JIS,韩国将韩文编译为Euc-kr. 每个国家都有自己的标准,因此不可避免地会发生冲突. 也就是说,在多语言混合文本中,将显示乱码.

char-encoding-problem

因此,Unicode应运而生. Unicode将所有语言统一为一组编码,因此不会再出现乱码了.

Unicode标准也在不断发展,但是最常用的一种是使用两个字节来表示一个字符(如果要使用非常远程的字符,则需要4个字节). 现代操作系统和大多数编程语言直接支持Unicode.

现在,让我们看一下ASCII编码和Unicode编码之间的区别: ASCII编码为1个字节,而Unicode编码通常为2个字节.

字母A的ASCII码为十进制的65和二进制的01000001;

ASCII代码中的字符0为十进制的48和二进制的00110000. 请注意,字符“ 0”和整数0是不同的;

汉字已超出ASCII编码的范围. Unicode编码为十进制的20013和二进制的01001110 00101101.

您可以猜测,如果将Unicode编码用于ASCII编码A,则只需在前面添加0. 因此,A的Unicode编码为00000000 01000001.

又出现了一个新问题: 如果将其统一为Unicode,则乱码问题将消失. 但是,如果您编写的文本基本上全部是英语,则Unicode编码所需的存储空间是ASCII编码的两倍,这在存储和传输方面非常不经济.

因此,本着节约的精神,再次出现了将Unicode编码转换为“可变长度编码”的UTF-8编码. UTF-8编码根据不同的数字大小将Unicode字符编码为1-6个字节. 常用英文字母编码为1个字节,汉字通常为3个字节. 仅将非常稀有的字符编码为4-6个字节. 如果要传输的文本包含很多英文字符,则使用UTF-8编码可以节省空间:

字符ASCIIUnicodeUTF-8

A

01000001

00000000 01000001

字符串_首行缩进2字符显示3字符_将字符数组a复制到字符数组b

01000001

中等

x

01001110 00101101

11100100 10111000 10101101

从上表中,您还可以发现UTF-8编码还有其他好处,即ASCII编码实际上可以视为UTF-8编码的一部分. 因此,许多仅支持ASCII编码的历史软件可以在UTF-8编码下继续工作.

在弄清了ASCII,Unicode和UTF-8之间的关系之后,我们可以总结一下计算机系统中字符编码的当前工作方法:

在计算机内存中,统一使用Unicode编码,当需要将其保存到硬盘或进行传输时,它会转换为UTF-8编码.

使用记事本进行编辑时,将从文件读取的UTF-8字符转换为Unicode字符到内存中. 编辑后,保存时,将Unicode转换为UTF-8并保存到文件:

rw-file-utf-8

浏览Web时,服务器会将动态生成的Unicode内容转换为UTF-8,然后将其传输到浏览器:

web-utf-8

因此,在许多网页的源代码上您会看到类似的信息,这表明该网页已以UTF-8编码.

弄清楚麻烦的字符编码问题后,让我们研究Python字符串.

在最新版本的Python 3中,字符串以Unicode编码,这意味着Python字符串支持多种语言,例如:

>>> print('包含中文的str')
包含中文的str

对于单个字符的编码,Python提供了ord()函数来获取字符的整数表示,而chr()函数将编码转换为相应的字符:

>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'

如果您知道字符的整数编码,也可以用十六进制形式写str:

将字符数组a复制到字符数组b_首行缩进2字符显示3字符_字符串

>>> '\u4e2d\u6587'
'中文'

两种书写方式完全相同.

由于Python的字符串类型为str,因此在内存中以Unicode表示,并且一个字符对应几个字节. 如果要在网络上传输或保存到磁盘,则需要将str更改为以字节为单位的字节.

Python使用以b开头的单引号或双引号来表示字节数据:

x = b'ABC'

请注意区分“ ABC”和“ b'ABC”. 前者是str. 尽管后者的内容显示与前者相同字符串,但每个字节字符仅占用一个字节.

可以使用encode()方法将以Unicode表示的str编码为指定的字节,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

纯英语的str可以用ASCII编码为字节,并且内容相同,包含中文的str可以用UTF-8编码为字节. 包含中文的str不能用ASCII编码,因为中文编码的范围超出了ASCII编码的范围,并且Python将报告错误.

以字节为单位,用\ x ##显示无法显示为ASCII字符的字节.

相反,如果我们从网络或磁盘读取字节流,则读取的数据为字节. 要将字节转换为str,需要使用decode()方法:

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

如果字节包含无法解码的字节,则define()方法将报告错误:

>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte

如果字节中只有一小部分无效字节,则可以传递errors ='ignore'来忽略错误的字节:

>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'

要计算str包含多少个字符,可以使用len()函数:

>>> len('ABC')
3
>>> len('中文')
2

len()函数计算str中的字符数. 如果用字节替换,则len()函数将计算字节数:

首行缩进2字符显示3字符_将字符数组a复制到字符数组b_字符串

>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6

可以看出,经过UTF-8编码后,汉字通常占3个字节,而英文字符仅占1个字节.

在处理字符串时,我们经常遇到str和字节之间的转换. 为了避免出现乱码问题,应始终使用UTF-8编码来转换str和字节.

由于Python源代码也是文本文件,因此当源代码包含中文时,在保存源代码时必须指定UTF-8编码. 当Python解释器读取源代码时,为了使它以UTF-8编码读取,我们通常在文件开头写入以下两行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

注释的第一行是告诉Linux / OS X系统,这是一个Python可执行程序,Windows系统将忽略此注释;

第二行注释是告诉Python解释器根据UTF-8编码读取源代码. 否则,您在源代码中编写的中文输出可能会出现乱码.

确认UTF-8编码并不意味着您的.py文件是UTF-8编码的. 您必须并确保文本编辑器使用的是没有BOM编码的UTF-8:

set-encoding-in-notepad++

如果.py文件本身使用UTF-8编码,并且还声明#-*-编码: utf-8-*-,请打开命令提示符以测试并正常显示中文:

py-chinese-test-in-cmd

最后一个常见问题是如何输出格式化的字符串. 我们经常输出类似'Hello dear xxx!您xx个月的电话费是xx,余额是类似xx'的字符串,xxx的内容根据变量而变化. 因此,需要一种简单的格式化字符串的方法.

py-str-format

在Python中,使用的格式化方法与C语言相同,例如,通过%实现:

>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'

您可能已经猜到了,%运算符用于格式化字符串. 在字符串中,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后跟几个变量或值,并且顺序应相对应. 如果只有一个%?,则可以省略括号.

常见的占位符是:

占位符替换内容

%d

字符串_将字符数组a复制到字符数组b_首行缩进2字符显示3字符

整数

%f

浮点数

%s

字符串

%x

十六进制整数

其中,在格式化整数和浮点数时,还可以指定是否添加0以及整数和小数位数:

# -*- coding: utf-8 -*-
----
print('%2d-d' % (3, 1))
print('%.2f' % 3.1415926)

如果不确定使用什么,%s将始终有效,它将任何数据类型转换为字符串:

>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'

有时,如果字符串中的%是正常字符怎么办?此时,您需要转义,使用%%代表a%:

>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'

格式化字符串的另一种方法是使用字符串的format()方法,该方法将依次用传递的参数替换字符串中的占位符{0},{1} ...,但是这种方式比%麻烦得多:

>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'

小明的得分从去年的72分上升到今年的85分. 请计算小明改进的百分比,并以字符串格式显示“ xx.x%”,仅保留小数点后一位:

# -*- coding: utf-8 -*-
s1 = 72
s2 = 85
----
r = ???
print('???' % r)

Python 3对字符串使用Unicode,它直接支持多种语言.

在str和字节之间转换时,需要指定编码. 最常用的编码是UTF-8. 当然,Python还支持其他编码方法,例如将Unicode编码为GB2312:

>>> '中文'.encode('gb2312')
b'\xd6\xd0\xce\x'

但是这种方法纯属自找麻烦. 如果没有特殊的业务要求,请记住仅使用UTF-8编码.

格式化字符串时,可以使用Python的交互式环境进行测试,这既方便又快捷.

the_string.py


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-288985-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...