字符串使用quoted printable 编码进行编码,这是一种将非ASCII 字节编码为ASCII 的方法。您可以像这样解码为str:
import quopri
s = '8=E2=85=9C'
f = quopri.decodestring(s).decode('utf-8')
print(f)
打印
8⅜
由str(8)加上unicode字符VULGAR FRACTION THREE EIGHTHS组成。
我们可以使用 unicode normalisation 进一步分解字符串
import unicodedata as ud
decomposed = ud.normalize('NFKD', f)
print(decomposed)
输出
83⁄8
我们可以结合这些方法来获取每个字符串的所有部分并将它们转换为整数或fractions:
import fractions
import quopri
import unicodedata as ud
values = """\
8=E2=85=9C
6=E2=85=9E
7=C2=BE
7=E2=85=9E
"""
for value in values.splitlines():
string_ = quopri.decodestring(value).decode('utf-8')
# Assume each string is composed solely of one or more digits,
# with the fraction character at the end
int_part = int(string_[:-1])
normalised = ud.normalize('NFKD', string_[-1])
# Note that the separator character here is chr(8260),
# the 'FRACTION SLASH' character, not the ASCII 'SOLIDUS'
nominator, _, denominator = normalised.partition('⁄')
fractional_part = fractions.Fraction(*map(int, (nominator, denominator)))
print(f'Integer part {int_part}, fractional part {fractional_part!r}')
print()
结果:
Integer part 8, fractional part Fraction(3, 8)
Integer part 6, fractional part Fraction(7, 8)
Integer part 7, fractional part Fraction(3, 4)
Integer part 7, fractional part Fraction(7, 8)
Fraction 实例可以按通常的方式转换为float 或str:
>>> ff = fractions.Fraction(15, 8)
>>> ff
Fraction(15, 8)
>>> str(ff)
'15/8'
>>> float(ff)
1.875