Unicode 指南— Python 3.10.7 說明文件

文章推薦指數: 80 %
投票人數:10人

还有有关显示的属性,比如如何在双向文本中使用码位。

以下程序显示了几个字符的信息,并打印一个字符的数值:. import unicodedata ... 瀏覽 索引 模組| 下一頁| 上一頁| Python» 3.10.7Documentation» Python如何達成任務» Unicode指南 | Unicode指南¶ 發佈版本 1.12 本文介绍了Python对表示文本数据的Unicode规范的支持,并对各种Unicode常见使用问题做了解释。

Unicode概述¶ 定義¶ 如今的程序需要能够处理各种各样的字符。

应用程序通常做了国际化处理,用户可以选择不同的语言显示信息和输出数据。

同一个程序可能需要以英语、法语、日语、希伯来语或俄语输出错误信息。

网页内容可能由这些语言书写,并且可能包含不同的表情符号。

Python的字符串类型采用Unicode标准来表示字符,使得Python程序能够正常处理所有这些不同的字符。

Unicode规范(https://www.unicode.org/)旨在罗列人类语言所用到的所有字符,并赋予每个字符唯一的编码。

该规范一直在进行修订和更新,不断加入新的语种和符号。

一个字符是文本的最小组件。

‘A’、‘B’、‘C’等都是不同的字符。

‘È’和‘Í’也一样。

字符会随着语言或者上下文的变化而变化。

比如,‘Ⅰ’是一个表示“罗马数字1”的字符,它与大写字母‘I’不同。

他们往往看起来相同,但这是两个有着不同含义的字符。

Unicode标准描述了字符是如何用码位(codepoint)表示的。

码位的取值范围是0到0x10FFFF的整数(大约110万个值,实际分配的数字没有那么多)。

在Unicode标准和本文中,码位采用U+265E的形式,表示值为0x265e的字符(十进制为9822)。

Unicode标准中包含了许多表格,列出了很多字符及其对应的码位。

0061'a';LATINSMALLLETTERA 0062'b';LATINSMALLLETTERB 0063'c';LATINSMALLLETTERC ... 007B'{';LEFTCURLYBRACKET ... 2167'Ⅷ';ROMANNUMERALEIGHT 2168'Ⅸ';ROMANNUMERALNINE ... 265E'♞';BLACKCHESSKNIGHT 265F'♟';BLACKCHESSPAWN ... 1F600'😀';GRINNINGFACE 1F609'😉';WINKINGFACE ... 严格地说,上述定义暗示了以下说法是没有意义的:“这是字符U+265E”。

U+265E只是一个码位,代表某个特定的字符;这里它代表了字符“国际象棋黑骑士”'♞'。

在非正式的上下文中,有时会忽略码位和字符的区别。

一个字符在屏幕或纸上被表示为一组图形元素,被称为字形(glyph)。

比如,大写字母A的字形,是两笔斜线和一笔横线,而具体的细节取决于所使用的字体。

大部分Python代码不必担心字形,找到正确的显示字形通常是交给GUI工具包或终端的字体渲染程序来完成。

编码¶ 上一段可以归结为:一个Unicode字符串是一系列码位(从0到0x10FFFF或者说十进制的1,114,111的数字)组成的序列。

这一序列在内存中需被表示为一组码元(codeunit),码元会映射成包含八个二进制位的字节。

将Unicode字符串翻译成字节序列的规则称为字符编码,或者编码。

大家首先会想到的编码可能是用32位的整数作为代码位,然后采用CPU对32位整数的表示法。

字符串“Python”用这种表示法可能会如下所示: Python 0x500000007900000074000000680000006f0000006e000000 01234567891011121314151617181920212223 这种表示法非常直白,但也存在一些问题。

不具可移植性;不同的处理器的字节序不同。

非常浪费空间。

在大多数文本中,大部分码位都小于127或255,因此字节0x00占用了大量空间。

相较于ASCII表示法所需的6个字节,以上字符串需要占用24个字节。

RAM用量的增加没那么要紧(台式计算机有成GB的RAM,而字符串通常不会有那么大),但要把磁盘和网络带宽的用量增加4倍是无法忍受的。

与现有的C函数(如strlen())不兼容,因此需要采用一套新的宽字符串函数。

因此这种编码用得不多,人们转而选择其他更高效、更方便的编码,比如UTF-8。

UTF-8是最常用的编码之一,Python往往默认会采用它。

UTF代表“UnicodeTransformationFormat”,'8'表示编码采用8位数。

(UTF-16和UTF-32编码也是存在的,但其使用频率不如UTF-8。

)UTF-8的规则如下: 如果码位<128,则直接用对应的字节值表示。

如果码位>=128,则转换为2、3、4个字节的序列,每个字节值都位于128和255之间。

UTF-8有几个很方便的特性: 可以处理任何Unicode码位。

Unicode字符串被转换为一个字节序列,仅在表示空(null)字符(U+0000)时才会包含零值的字节。

这意味着strcpy()之类的C函数可以处理UTF-8字符串,而且用那些不能处理字符串结束符之外的零值字节的协议也能发送。

ASCII字符串也是也是也是合法的UTF-8文本。

UTF-8相当紧凑;大多数常用字符均可用一两个字节表示。

如果字节数据被损坏或丢失,则可以找出下一个UTF-8码点的开始位置并重新开始同步。

随机的8位数据也不太可能像是有效的UTF-8编码。

UTF-8是一种面向字节的编码。

编码规定了每个字符由一个或多个字节的序列表示。

这避免了整数和双字节编码(如UTF-16和UTF-32)可能出现的字节顺序问题,那时的字节序列会因执行编码的硬件而异。

参考文献¶ UnicodeConsortium站点包含Unicode规范的字符图表、词汇表和PDF版本。

请做好准备,有些内容读起来有点难度。

该网站上还提供了Unicode起源和发展的`年表`_。

在Computerphile的Youtube频道上,TomScott简要地`讨论了Unicode和UTF-8`_(9分36秒)的历史。

Tohelpunderstandthestandard,JukkaKorpelahaswrittenanintroductory guidetoreadingthe Unicodecharactertables. JoelSpolsky撰写了另一篇不错的介绍性文章`_。

如果本文没让您弄清楚,那应在继续之前先试着读读这篇文章。

Wikipedia条目通常也有帮助;请参阅“字符编码”和UTF-8的条目,例如: Python对Unicode的支持¶ 现在您已经了解了Unicode的基础知识,可以看下Python的Unicode特性。

字符串类型¶ 从Python3.0开始,str类型包含了Unicode字符,这意味着用``"unicoderocks!"、'unicoderocks!'``或三重引号字符串语法创建的任何字符串都会存储为Unicode。

Python源代码的默认编码是UTF-8,因此可以直接在字符串中包含Unicode字符: try: withopen('/tmp/input.txt','r')asf: ... exceptOSError: #'Filenotfound'errormessage. print("Fichiernontrouvé") 旁注:Python3还支持在标识符中使用Unicode字符: répertoire="/tmp/records.log" withopen(répertoire,"w")asf: f.write("test\n") 如果无法在编辑器中输入某个字符,或出于某种原因想只保留ASCII编码的源代码,则还可以在字符串中使用转义序列。

(根据系统的不同,可能会看到真的大写Delta字体而不是u转义符。

): >>>"\N{GREEKCAPITALLETTERDELTA}"#Usingthecharactername '\u0394' >>>"\u0394"#Usinga16-bithexvalue '\u0394' >>>"\U00000394"#Usinga32-bithexvalue '\u0394' 此外,可以用bytes的decode()方法创建一个字符串。

该方法可以接受encoding参数,比如可以为UTF-8,以及可选的errors参数。

若无法根据编码规则对输入字符串进行编码,errors参数指定了响应策略。

该参数的合法值可以是'strict'(触发UnicodeDecodeError异常)、'replace'(用U+FFFD、REPLACEMENTCHARACTER)、'ignore'(只是将字符从Unicode结果中去掉),或'backslashreplace'(插入一个\xNN转义序列)。

以下示例演示了这些不同的参数: >>>b'\x80abc'.decode("utf-8","strict") Traceback(mostrecentcalllast): ... UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0x80inposition0: invalidstartbyte >>>b'\x80abc'.decode("utf-8","replace") '\ufffdabc' >>>b'\x80abc'.decode("utf-8","backslashreplace") '\\x80abc' >>>b'\x80abc'.decode("utf-8","ignore") 'abc' 编码格式以包含编码格式名称的字符串来指明。

Python有大约100种不同的编码格式;清单详见Python库参考文档标准编码。

一些编码格式有多个名称,比如'latin-1'、'iso_8859_1'和'8859都是指同一种编码。

利用内置函数chr()还可以创建单字符的Unicode字符串,该函数可接受整数参数,并返回包含对应码位的长度为1的Unicode字符串。

内置函数ord()是其逆操作,参数为单个字符的Unicode字符串,并返回码位值: >>>chr(57344) '\ue000' >>>ord('\ue000') 57344 转换为字节¶ bytes.decode()的逆方法是str.encode(),它会返回Unicode字符串的bytes形式,已按要求的encoding进行了编码。

参数errors的意义与decode()方法相同,但支持更多可能的handler。

除了'strict'、'ignore'和'replace'(这时会插入问号替换掉无法编码的字符),还有'xmlcharrefreplace'(插入一个XML字符引用)、backslashreplace(插入一个\uNNNN转义序列)和namereplace(插入一个\N{...}转义序列)。

以下例子演示了各种不同的结果: >>>u=chr(40960)+'abcd'+chr(1972) >>>u.encode('utf-8') b'\xea\x80\x80abcd\xde\xb4' >>>u.encode('ascii') Traceback(mostrecentcalllast): ... UnicodeEncodeError:'ascii'codeccan'tencodecharacter'\ua000'in position0:ordinalnotinrange(128) >>>u.encode('ascii','ignore') b'abcd' >>>u.encode('ascii','replace') b'?abcd?' >>>u.encode('ascii','xmlcharrefreplace') b'ꀀabcd޴' >>>u.encode('ascii','backslashreplace') b'\\ua000abcd\\u07b4' >>>u.encode('ascii','namereplace') b'\\N{YISYLLABLEIT}abcd\\u07b4' 用于注册和访问可用编码格式的底层函数,位于codecs模块中。

若要实现新的编码格式,则还需要了解codecs模块。

不过该模块返回的编码和解码函数通常更为底层一些,不大好用,编写新的编码格式是一项专业的任务,因此本文不会涉及该模块。

Python源代码中的Unicode文字¶ 在Python源代码中,可以用\u转义序列书写特定的Unicode码位,该序列后跟4个代表码位的十六进制数字。

\U转义序列用法类似,但要用8个十六进制数字,而不是4个: >>>s="a\xac\u1234\u20ac\U00008000" ...#^^^^two-digithexescape ...#^^^^^^four-digitUnicodeescape ...#^^^^^^^^^^eight-digitUnicodeescape >>>[ord(c)forcins] [97,172,4660,8364,32768] 对大于127的码位使用转义序列,数量不多时没什么问题,但如果要用到很多重音字符,这会变得很烦人,类似于程序中的信息是用法语或其他使用重音的语言写的。

也可以用内置函数chr()拼装字符串,但会更加乏味。

理想情况下,都希望能用母语的编码书写文本。

还能用喜好的编辑器编辑Python源代码,编辑器要能自然地显示重音符,并在运行时使用正确的字符。

默认情况下,Python支持以UTF-8格式编写源代码,但如果声明要用的编码,则几乎可以使用任何编码。

只要在源文件的第一行或第二行包含一个特殊注释即可: #!/usr/bin/envpython #-*-coding:latin-1-*- u='abcdé' print(ord(u[-1])) 上述语法的灵感来自于Emacs用于指定文件局部变量的符号。

Emacs支持许多不同的变量,但Python仅支持“编码”。

-*-符号向Emacs标明该注释是特殊的;这对Python没有什么意义,只是一种约定。

Python会在注释中查找coding:name或coding=name。

如果没有这种注释,则默认编码将会是前面提到的UTF-8。

更多信息请参阅PEP263。

Unicode属性¶ Unicode规范包含了一个码位信息数据库。

对于定义的每一个码位,都包含了字符的名称、类别、数值(对于表示数字概念的字符,如罗马数字、分数如三分之一和五分之四等)。

还有有关显示的属性,比如如何在双向文本中使用码位。

以下程序显示了几个字符的信息,并打印一个字符的数值: importunicodedata u=chr(233)+chr(0x0bf2)+chr(3972)+chr(6000)+chr(13231) fori,cinenumerate(u): print(i,'%04x'%ord(c),unicodedata.category(c),end="") print(unicodedata.name(c)) #Getnumericvalueofsecondcharacter print(unicodedata.numeric(u[1])) 当运行时,这将打印出: 000e9LlLATINSMALLLETTEREWITHACUTE 10bf2NoTAMILNUMBERONETHOUSAND 20f84MnTIBETANMARKHALANTA 31770LoTAGBANWALETTERSA 433afSoSQUARERADOVERSSQUARED 1000.0 类别代码是描述字符性质的一个缩写。

分为“字母”、“数字”、“标点符号”或“符号”等类别,而这些类别又分为子类别。

就以上输出的代码而言,'Ll'表示“字母,小写”,'No'表示“数字,其他”,'Mn'表示“标记,非空白符”,'So'是“符号,其他”。

有关类别代码的清单,请参阅Unicode字符库文档`_的“通用类别值”部分。

字符串比较¶ Unicode让字符串的比较变得复杂了一些,因为同一组字符可能由不同的码位序列组成。

例如,像“ê”这样的字母可以表示为单码位U+00EA,或是U+0065U+0302,即“e”的码位后跟“COMBININGCIRCUMFLEXACCENT”的码位。

虽然在打印时会产生同样的输出,但一个是长度为1的字符串,另一个是长度为2的字符串。

一种不区分大小写比较的工具是字符串方法casefold(),将按照Unicode标准描述的算法将字符串转换为不区分大小写的形式。

该算法对诸如德语字母“ß”(代码点U+00DF)之类的字符进行了特殊处理,变为一对小写字母“ss”。

>>>street='Gürzenichstraße' >>>street.casefold() 'gürzenichstrasse' 第二个工具是unicodedata模块的normalize()函数,将字符串转换为几种规范化形式之一,其中后跟组合字符的字母将被替换为单个字符。

normalize()可用于执行字符串比较,即便两个字符串采用不同的字符组合,也不会错误地报告两者不相等: importunicodedata defcompare_strs(s1,s2): defNFD(s): returnunicodedata.normalize('NFD',s) returnNFD(s1)==NFD(s2) single_char='ê' multiple_chars='\N{LATINSMALLLETTERE}\N{COMBININGCIRCUMFLEXACCENT}' print('lengthoffirststring=',len(single_char)) print('lengthofsecondstring=',len(multiple_chars)) print(compare_strs(single_char,multiple_chars)) 当运行时,这将输出: $python3compare-strs.py lengthoffirststring=1 lengthofsecondstring=2 True normalize()函数的第一个参数是个字符串,给出所需的规范化形式,可以是“NFC”、“NFKC”、“NFD”和“NFKD”之一。

Unicode标准还设定了如何进行不区分大小写的比较: importunicodedata defcompare_caseless(s1,s2): defNFD(s): returnunicodedata.normalize('NFD',s) returnNFD(NFD(s1).casefold())==NFD(NFD(s2).casefold()) #Exampleusage single_char='ê' multiple_chars='\N{LATINCAPITALLETTERE}\N{COMBININGCIRCUMFLEXACCENT}' print(compare_caseless(single_char,multiple_chars)) 这将打印True。

(为什么NFD()会被调用两次?因为有几个字符让casefold()返回非规范化的字符串,所以结果需要再次进行规范化。

参见Unicode标准的3.13节的一个讨论和示例。

) Unicode正则表达式¶ re模块支持的正则表达式可以用字节串或字符串的形式提供。

有一些特殊字符序列,比如\d和\w具有不同的含义,具体取决于匹配模式是以字节串还是字符串形式提供的。

例如,\d将匹配字节串中的字符[0-9],但对于字符串将会匹配'Nd'类别中的任何字符。

上述示例中的字符串包含了泰语和阿拉伯数字书写的数字57: importre p=re.compile(r'\d+') s="Over\u0e55\u0e5757flavours" m=p.search(s) print(repr(m.group())) 执行时,\d+将匹配上泰语数字并打印出来。

如果向compile()提供的是re.ASCII标志,\d+则会匹配子串"57"。

类似地,\w将匹配多种Unicode字符,但对于字节串则只会匹配[a-zA-Z0-9_],如果指定re.ASCII,\s``将匹配Unicode空白符或``[\t\n\r\f\v]。

参考文献¶ 关于Python的Unicode支持,其他还有一些很好的讨论: ProcessingTextFilesinPython3,byNickCoghlan. 实用的Unicode,NedBatchelder在PyCon2012上的演示。

str类型在Python库参考文档文本序列类型---str中有介绍。

unicodedata模块的文档 codecs模块的文档 Marc-AndréLemburg在EuroPython2002上做了一个题为“Python和Unicode”(PDF幻灯片)`_的演示文稿。

该幻灯片很好地概括了Python2的Unicode功能设计(其中Unicode字符串类型称为unicode,文字以u开头)。

Unicode数据的读写¶ 既然处理Unicode数据的代码写好了,下一个问题就是输入/输出了。

如何将Unicode字符串读入程序,如何将Unicode转换为适于存储或传输的形式呢? 根据输入源和输出目标的不同,或许什么都不用干;请检查一下应用程序用到的库是否原生支持Unicode。

例如,XML解析器往往会返回Unicode数据。

许多关系数据库的字段也支持Unicode值,并且SQL查询也能返回Unicode值。

在写入磁盘或通过套接字发送之前,Unicode数据通常要转换为特定的编码。

可以自己完成所有工作:打开一个文件,从中读取一个8位字节对象,然后用bytes.decode(encoding)对字节串进行转换。

但是,不推荐采用这种全人工的方案。

编码的多字节特性就是一个难题;一个Unicode字符可以用几个字节表示。

如果要以任意大小的块(例如1024或4096字节)读取文件,那么在块的末尾可能只读到某个Unicode字符的部分字节,这就需要编写错误处理代码。

有一种解决方案是将整个文件读入内存,然后进行解码,但这样就没法处理很大的文件了;若要读取2GB的文件,就需要2GB的RAM。

(其实需要的内存会更多些,因为至少有一段时间需要在内存中同时存放已编码字符串及其Unicode版本。

) 解决方案是利用底层解码接口去捕获编码序列不完整的情况。

这部分代码已经是现成的:内置函数open()可以返回一个文件类的对象,该对象认为文件的内容采用指定的编码,read()和write()等方法接受Unicode参数。

只要用open()的encoding和errors参数即可,参数释义同str.encode()和bytes.decode()。

因此从文件读取Unicode就比较简单了: withopen('unicode.txt',encoding='utf-8')asf: forlineinf: print(repr(line)) 也可以在更新模式下打开文件,以便同时读取和写入: withopen('test',encoding='utf-8',mode='w+')asf: f.write('\u4500blahblahblah\n') f.seek(0) print(repr(f.readline()[:1])) Unicode字符U+FEFF用作字节顺序标记(BOM),通常作为文件的第一个字符写入,以帮助自动检测文件的字节顺序。

某些编码(例如UTF-16)期望在文件开头出现BOM;当采用这种编码时,BOM将自动作为第一个字符写入,并在读取文件时会静默删除。

这些编码有多种变体,例如用于little-endian和big-endian编码的“utf-16-le”和“utf-16-be”,会指定一种特定的字节顺序并且不会忽略BOM。

在某些地区,习惯在UTF-8编码文件的开头用上“BOM”;此名称具有误导性,因为UTF-8与字节顺序无关。

此标记只是声明该文件以UTF-8编码。

要读取此类文件,请使用“utf-8-sig”编解码器自动忽略此标记。

Unicode文件名¶ 当今大多数操作系统都支持包含任意Unicode字符的文件名。

通常这是通过将Unicode字符串转换为某种根据具体系统而定的编码格式来实现的。

如今的Python倾向于使用UTF-8:MacOS上的Python已经在多个版本中使用了UTF-8,而Python3.6也已在Windows上改用了UTF-8。

在Unix系统中,将只有一个文件系统编码格式。

如果你已设置了LANG或LC_CTYPE环境变量的话;如果未设置,则默认编码格式还是UTF-8。

sys.getfilesystemencoding()函数将返回要在当前系统采用的编码,若想手动进行编码时即可用到,但无需多虑。

在打开文件进行读写时,通常只需提供Unicode字符串作为文件名,会自动转换为合适的编码格式: filename='filename\u4500abc' withopen(filename,'w')asf: f.write('blah\n') os模块中的函数也能接受Unicode文件名,如os.stat()。

os.listdir()函数返回文件名,这引发了一个问题:它应该返回文件名的Unicode版本,还是应该返回包含已编码版本的字节串?这两者os.listdir()都能做到,具体取决于你给出的目录路径是字节串还是Unicode字符串形式的。

如果你传入一个Unicode字符串作为路径,文件名将使用文件系统的编码格式进行解码并返回一个Unicode字符串列表,而传入一个字节串形式的路径则将返回字节串形式的文件名。

例如,假定默认文件系统编码为UTF-8,运行以下程序: fn='filename\u4500abc' f=open(fn,'w') f.close() importos print(os.listdir(b'.')) print(os.listdir('.')) 将产生以下输出: $pythonlistdir-test.py [b'filename\xe4\x94\x80abc',...] ['filename\u4500abc',...] 第一个列表包含UTF-8编码的文件名,第二个列表则包含Unicode版本的。

请注意,大多时候应该坚持用这些API处理Unicode。

字节串API应该仅用于可能存在不可解码文件名的系统;现在几乎仅剩Unix系统了。

识别Unicode的编程技巧¶ 本节提供了一些关于编写Unicode处理软件的建议。

最重要的技巧如下: 程序应只在内部处理Unicode字符串,尽快对输入数据进行解码,并只在最后对输出进行编码。

如果尝试编写的处理函数对Unicode和字节串形式的字符串都能接受,就会发现组合使用两种不同类型的字符串时,容易产生差错。

没办法做到自动编码或解码:如果执行str+bytes,则会触发TypeError。

当要使用的数据来自Web浏览器或其他不受信来源时,常用技术是在用该字符串生成命令行之前,或要存入数据库之前,先检查字符串中是否包含非法字符。

请仔细检查解码后的字符串,而不是编码格式的字节串数据;有些编码可能具备一些有趣的特性,例如与ASCII不是一一对应或不完全兼容。

如果输入数据还指定了编码格式,则尤其如此,因为攻击者可以选择一种巧妙的方式将恶意文本隐藏在经过编码的字节流中。

在文件编码格式之间进行转换¶ StreamRecoder类可以在两种编码之间透明地进行转换,参数为编码格式为#1的数据流,表现行为则是编码格式为#2的数据流。

假设输入文件f采用Latin-1编码格式,即可用StreamRecoder包装后返回UTF-8编码的字节串: new_f=codecs.StreamRecoder(f, #en/decoder:usedbyread()toencodeitsresultsand #bywrite()todecodeitsinput. codecs.getencoder('utf-8'),codecs.getdecoder('utf-8'), #reader/writer:usedtoreadandwritetothestream. codecs.getreader('latin-1'),codecs.getwriter('latin-1')) 编码格式未知的文件¶ 若需对文件进行修改,但不知道文件的编码,那该怎么办呢?如果已知编码格式与ASCII兼容,并且只想查看或修改ASCII部分,则可利用surrogateescape错误处理handler打开文件: withopen(fname,'r',encoding="ascii",errors="surrogateescape")asf: data=f.read() #makechangestothestring'data' withopen(fname+'.new','w', encoding="ascii",errors="surrogateescape")asf: f.write(data) surrogateescape错误处理handler会把所有非ASCII字节解码为U+DC80至U+DCFF这一特殊范围的码位。

当surrogateescape错误处理handler用于数据编码并回写时,这些码位将转换回原样。

参考文献¶ OnesectionofMasteringPython3Input/Output, aPyCon2010talkbyDavidBeazley,discussestextprocessingandbinarydatahandling. Marc-AndréLemburg演示的PDF幻灯片“在Python中编写支持Unicode的应用程序”,讨论了字符编码问题以及如何国际化和本地化应用程序。

这些幻灯片仅涵盖Python2.x。

TheGutsofUnicodeinPython isaPyCon2013talkbyBenjaminPetersonthatdiscussestheinternalUnicode representationinPython3.3. 致謝¶ 本文初稿由AndrewKuchling撰写。

此后,AlexanderBelopolsky、GeorgBrandl、AndrewKuchling和EzioMelotti作了进一步修订。

感谢以下各位指出本文错误或提出建议:ÉricAraujo、NicholasBastin、NickCoghlan、MariusGedminas、KentJohnson、KenKrugler、Marc-AndréLemburg、MartinvonLöwis、TerryJ.Reedy、SerhiyStorchaka,ErykSun,ChadWhitacre,GrahamWideman。

目录 Unicode指南 Unicode概述 定義 编码 参考文献 Python对Unicode的支持 字符串类型 转换为字节 Python源代码中的Unicode文字 Unicode属性 字符串比较 Unicode正则表达式 参考文献 Unicode数据的读写 Unicode文件名 识别Unicode的编程技巧 在文件编码格式之间进行转换 编码格式未知的文件 参考文献 致謝 上個主題 如何排序 下個主題 如何使用urllib套件取得網路資源 此頁面 回報錯誤 顯示原始碼 瀏覽 索引 模組| 下一頁| 上一頁| Python» 3.10.7Documentation» Python如何達成任務» Unicode指南 |



請為這篇文章評分?