python3 文本过滤与清理 处理文本成ASCII字符 encode()与decode()

本文介绍了一种将Unicode数字字符转换为ASCII数字的方法,并演示了如何处理包含特殊Unicode字符的字符串,使其仅保留ASCII字符。此外,还提供了将字符串转换为UTF-8格式的技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将所有Unicode十进制数字字符,转换成ASCII版数字字符

import unicodedata ,sys
digitmap = {c:ord('0') + unicodedata.digit(chr(c))
            for c in range(sys.maxunicode)
            if unicodedata.category(chr(c)) == 'Nd'}
print(len(digitmap))
#print(digitmap)

x='\u0661\u0662\u0663'
print(x)
print(x.translate(digitmap))

运行结果如上。580,表示现在Unicode里面有580个数字字符(即58种1-10的表示方法)

将字符串处理成只有ASCII字符

import unicodedata ,sys

print()

a = 's\u00f1o'
print(a)
print(ascii(a))
b = unicodedata.normalize('NFD',a)
print(b)
print(ascii(b))

print()

result1 = a.encode('ascii','ignore').decode('ascii')
print(result1)
result = b.encode('ascii','ignore').decode('ascii')#这里的ascii可以改成你想处理成的任何编码格式
print(result)

运行结果如上。如果ñ是全组成的,那么就会被消掉。如果ñ是组合字符,那么只会去掉~符号。一般由于UTF-8使用方便,所以程序里面的ascii改成utf-8就可以了。

将字符串处理成只有UTF-8字符

def to_utf8(s):
    result = s.encode('utf-8','ignore').decode('utf-8')
    return result

encode()与decode()

str对象可以使用encode(XXX),返回bytes对象。此bytes对象,是根据字符和某种编码方式里面的对应关系(实际是该字符在该编码方式下存储的字节),即若干十六进制数。


比如这个“上”字,它用utf-8来存储,实际存储的是b'\xe4\xb8\x8a'。

用gbk来存储,实际存储的是b'\xc9\xcf'。

所以当你拿到了bytes对象,并且知道了这个某个字符串在计算机实际存储的字节,但你还得知道这是那种方式转换而来实际存储字节,知道到底这是utf-8还是gbk或者别的编码方式的实际存储方式。

bytes对象可以使用decode(XXX),返回str对象。根据实际存储的字节和某种编码方式,通过编码方式的对应关系,把存储字节转换为字符。


如图所示,b'\xe4\xb8\x8a'本来是utf-8的一条对应关系,但是gbk中却没有这条对应关系所以报错,而且这个可能也跟utf-8用三个字节来存储一个汉字,gbk只用两个字节来存储一个汉字有关。

总之,在对bytes对象使用decode(XXX)时,一定要搞清楚bytes对象是通过哪种编码方式来的(即encode(XXX)里的XXX),再使用同样的XXX。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值