您已经将Unipre与UTF-8混淆了。Latin-1是Unipre的子集,但不是UTF-8的子集。 避免像瘟疫一样思考各个代码单元。
只需使用代码点即可。不要考虑UTF-8。考虑一下Unipre。这是您感到困惑的地方。
演示程序的源代码
在Python中使用Unipre非常容易。特别是在Python
3和广泛的版本中,这是我使用Python的唯一方式,但是如果您小心翼翼地坚持使用UTF-8,仍然可以在狭窄的版本中使用旧版Python 2。
为此,请始终将您的源代码编码和输出编码正确地转换为UTF-8。现在,不要再考虑UTF了,而在整个Python程序中仅使用UTF-8文字,逻辑代码点号或符号字符名称。
这是带有行号的源代码:
% cat -n /tmp/py 1 #!/usr/bin/env python3.2 2 # -*- coding: UTF-8 -*- 3 4 from __future__ import unipre_literals 5 from __future__ import print_function 6 7 import sys 8 import os 9 import re 10 11 if not (("PYTHONIOENCODING" in os.environ) 12 and 13 re.search("^utf-?8$", os.environ["PYTHONIOENCODING"], re.I)): 14 sys.stderr.write(sys.argv[0] + ": Please set your PYTHonIOENCODING envariable to utf8n") 15 sys.exit(1) 16 17 print('1a: el nixF1o') 18 print('2a: el ninu0303o') 19 20 print('1a: el niño') 21 print('2b: el niño') 22 23 print('1c: el niN{LATIN SMALL LETTER N WITH TILDE}o') 24 print('2c: el ninN{COMBINING TILDE}o')以下是带有非ASCII字符且使用
x{⋯}符号单引号的打印功能:% grep -n ^print /tmp/py | uniquote -x17:print('1a: el nixF1o')18:print('2a: el ninu0303o')20:print('1b: el nix{F1}o')21:print('2b: el ninx{303}o')23:print('1c: el niN{LATIN SMALL LETTER N WITH TILDE}o')24:print('2c: el ninN{COMBINING TILDE}o')演示程序样本运行
这是该程序的示例运行,显示了执行该操作的三种不同方式(a,b和c):第一种设置为源代码中的文字(将受StackOverflow的NFC转换约束,因此不可信任!!)
!)和后两个集合分别具有 数字Unipre代码点 和 符号Unipre字符名称
,它们再次被单引号括起来,因此您可以看到真正的含义:
% python /tmp/py1a: el niño2a: el niño1b: el niño2b: el niño1c: el niño2c: el niño% python /tmp/py | uniquote -x1a: el nix{F1}o2a: el ninx{303}o1b: el nix{F1}o2b: el ninx{303}o1c: el nix{F1}o2c: el ninx{303}o% python /tmp/py | uniquote -v1a: el niN{LATIN SMALL LETTER N WITH TILDE}o2a: el ninN{COMBINING TILDE}o1b: el niN{LATIN SMALL LETTER N WITH TILDE}o2b: el ninN{COMBINING TILDE}o1c: el niN{LATIN SMALL LETTER N WITH TILDE}o2c: el ninN{COMBINING TILDE}o我真的不喜欢二进制文件,但这是二进制字节的样子:
% python /tmp/py | uniquote -b1a: el nixC3xB1o2a: el ninxCCx83o1b: el nixC3xB1o2b: el ninxCCx83o1c: el nixC3xB1o2c: el ninxCCx83o
这个故事的主旨
即使使用UTF-8源码,也应该仅考虑和使用逻辑Unipre代码点编号(或符号命名字符),而不要使用作为UTF-8串行表示基础的单个8位代码单元(或就此而言)
UTF-16)。很少需要代码单位而不是代码点,这只会使您感到困惑。
如果使用广泛的Python3版本,您将获得比其他选择更可靠的行为,但这是UTF-32问题,而不是UTF-8问题。如果您顺其自然,那么UTF-32和UTF-8都易于使用。



