python3 将 ascii 字符串解释为 unicode 字符串
python3 interpret ascii string as unicode string
我有一个文本文件,打开后如下所示:
\xF0\x9F\x98\x81
\xF0\x9F\x98\x82
\xF0\x9F\x98\x83
\xF0\x9F\x98\x84
\xF0\x9F\x98\x85
hexdump 看起来像这样:
0000000 5c 78 46 30 5c 78 39 46 5c 78 39 38 5c 78 38 31
0000010 0a 5c 78 46 30 5c 78 39 46 5c 78 39 38 5c 78 38
0000020 32 0a 5c 78 46 30 5c 78 39 46 5c 78 39 38 5c 78
0000030 38 33 0a 5c 78 46 30 5c 78 39 46 5c 78 39 38 5c
0000040 78 38 34 0a 5c 78 46 30 5c 78 39 46 5c 78 39 38
我正在尝试打印 Python 中的字符串,就好像它们是 unicode 字符串一样。以下事情都失败了:
with open ("file") as f:
for row in f:
x = row.split()
for i in x:
print(i)
print(bytes(i, encoding='utf-8'))
print(bytes(i, encoding='utf-8').decode('unicode-escape'))
版画
\xF0\x9F\x98\x81
b'\xF0\x9F\x98\x81'
ð
\xF0\x9F\x98\x82
b'\xF0\x9F\x98\x82'
ð
\xF0\x9F\x98\x83
b'\xF0\x9F\x98\x83'
ð
\xF0\x9F\x98\x84
b'\xF0\x9F\x98\x84'
ð
\xF0\x9F\x98\x85
b'\xF0\x9F\x98\x85'
ð
我想要达到的效果就像我直接输入以下内容一样:
print(b'\xF0\x9F\x98\x81'.decode('utf-8'))
print(b'\xF0\x9F\x98\x82'.decode('utf-8'))
print(b'\xF0\x9F\x98\x83'.decode('utf-8'))
print(b'\xF0\x9F\x98\x84'.decode('utf-8'))
print(b'\xF0\x9F\x98\x85'.decode('utf-8'))
unicode-escape
给出一个带有指定代码点的 Unicode 字符串。 latin1
将其直接转换回字节字符串,因为在 latin1
和前 256 个代码点之间存在 1:1 映射。最后使用 UTF-8 解码回 Unicode。
data = rb'''\xF0\x9F\x98\x81
\xF0\x9F\x98\x82
\xF0\x9F\x98\x83
\xF0\x9F\x98\x84
\xF0\x9F\x98\x85'''
data = data.decode('unicode-escape').encode('latin-1').decode('utf8')
print(ascii(data))
print(data)
输出:
'\U0001f601\n\U0001f602\n\U0001f603\n\U0001f604\n\U0001f605'
注意:我的字体不支持这些字符。
我有一个文本文件,打开后如下所示:
\xF0\x9F\x98\x81
\xF0\x9F\x98\x82
\xF0\x9F\x98\x83
\xF0\x9F\x98\x84
\xF0\x9F\x98\x85
hexdump 看起来像这样:
0000000 5c 78 46 30 5c 78 39 46 5c 78 39 38 5c 78 38 31
0000010 0a 5c 78 46 30 5c 78 39 46 5c 78 39 38 5c 78 38
0000020 32 0a 5c 78 46 30 5c 78 39 46 5c 78 39 38 5c 78
0000030 38 33 0a 5c 78 46 30 5c 78 39 46 5c 78 39 38 5c
0000040 78 38 34 0a 5c 78 46 30 5c 78 39 46 5c 78 39 38
我正在尝试打印 Python 中的字符串,就好像它们是 unicode 字符串一样。以下事情都失败了:
with open ("file") as f:
for row in f:
x = row.split()
for i in x:
print(i)
print(bytes(i, encoding='utf-8'))
print(bytes(i, encoding='utf-8').decode('unicode-escape'))
版画
\xF0\x9F\x98\x81
b'\xF0\x9F\x98\x81'
ð
\xF0\x9F\x98\x82
b'\xF0\x9F\x98\x82'
ð
\xF0\x9F\x98\x83
b'\xF0\x9F\x98\x83'
ð
\xF0\x9F\x98\x84
b'\xF0\x9F\x98\x84'
ð
\xF0\x9F\x98\x85
b'\xF0\x9F\x98\x85'
ð
我想要达到的效果就像我直接输入以下内容一样:
print(b'\xF0\x9F\x98\x81'.decode('utf-8'))
print(b'\xF0\x9F\x98\x82'.decode('utf-8'))
print(b'\xF0\x9F\x98\x83'.decode('utf-8'))
print(b'\xF0\x9F\x98\x84'.decode('utf-8'))
print(b'\xF0\x9F\x98\x85'.decode('utf-8'))
unicode-escape
给出一个带有指定代码点的 Unicode 字符串。 latin1
将其直接转换回字节字符串,因为在 latin1
和前 256 个代码点之间存在 1:1 映射。最后使用 UTF-8 解码回 Unicode。
data = rb'''\xF0\x9F\x98\x81
\xF0\x9F\x98\x82
\xF0\x9F\x98\x83
\xF0\x9F\x98\x84
\xF0\x9F\x98\x85'''
data = data.decode('unicode-escape').encode('latin-1').decode('utf8')
print(ascii(data))
print(data)
输出:
'\U0001f601\n\U0001f602\n\U0001f603\n\U0001f604\n\U0001f605'
注意:我的字体不支持这些字符。