用Python将Unicode转换为ASCII

通过这篇文章,我们将学习如何将Unicode编码成字节,看到系统编码的不同方式,并在Python中把Unicode转换成ASCII。

在Python中把Unicode转换为ASCII

Python 3中的基本问题字符串是由字符组成的;我们在Python中没有字符类型,但它们包含Unicode字符。

如果我们说a = 'abcd' ,并使用len() 函数检查它的长度,那么我们得到4以及我们声明s='שלום' ,意思是你好,这是希伯来语中的单词。这些长度将是相同的,这很好,因为两个变量都有四个字符。

>>a='abcd'
>>len(a)
4
>>s='שלום'
>>len(s)
4

事实上,背后是不同的字节数,这与这里的问题无关,len() 是测量字符数,而不是字节数,当然,在背后,UTF-8 Unicode字符和UTF-8编码是使用更多的字节。

那么我们如何将我们的字符串变成我们需要的字节数呢?好吧,我们可以使用s.encode() ,如果我们这样做,它会返回一个字节字符串,这将是我们需要创建希伯来语单词שלום 的八个字节。

>>s.encode()
b'xd7xa9xd7x9cxd7x95xd7x9d'
>>'abcd'.encode()
b'abcd'

现在,我们将把一个Unicode字符串变成一个字节字符串,但它比这更复杂,因为我们知道这个字符串שלום ,我们想找回不代表Unicode底层字节的字节。我们想拿回不同编码系统的底层字节。

例如,我们使用iso-8859-8 ,这是一种你可能听说过的在西欧经常使用的编码,它允许我们在一个字节里有我们需要的特定语言的所有不同的字符,所以如果我们需要把一个字符串变成一个非Unicode的编码。

>>s.encode('iso-8859-8')
b'xf9xecxe5xed'

让我们看看,如果我们有来自不同语言的东西,就像我们说的s='北京' ,是北京的,如果我们去编码它,那么我们就会得到一个字节的字符串。

我们看到这里,我们有六个字节,因为每个汉字由三个字节表示;这就是我们的可变长度编码,发生在UTF-8中。

>>s='北京'
>>s.encode()
b'xe5x8cx97xe4xbaxac'

现在我们想用iso-8859-8 来编码北京 ,当我们执行这个时,我们得到一个UnicodeEncodeError ,意思是这个编码在对我们说,你想把这些Unicode字符变成iso-8859-8 编码的字节,这是不允许的。

s.encode('iso-8859-8')

用Python将Unicode转换为ASCII

如果我们用这个连接英语单词,也会失败,因为在任何可能出现错误的地方,它都会失败,但我们可以添加一个参数,帮助忽略错误。

>>s='I often go to 北京'
>>s.encode('iso-8859-8',errors='ignore')
b'I often go to '

如果你有一大堆文本,并且可以丢失Unicode字符,你可以使用这个。

让我们看一下help(s.encode) ,它默认等于strict ,但它可以是一些不同的东西,所以如果我们使用replace 的值到errors ,它并不真正知道如何替换,所以它只是要使用问号。

help(s.encode)

用Python将Unicode转换为ASCII

>>s='I often go to 北京'
>>s.encode('iso-8859-8',errors='replace')
b'I often go to ??'

当我们使用xmlcharrefreplace ,我们得到的是与这些Unicode字符有关的XML实体,所以如果你要把这个粘贴到XML文档中,或者也许粘贴到HTML中,那么这就可以工作。

>>s.encode('iso-8859-8',errors='xmlcharrefreplace')
b'I often go to 北京'

这取决于你的需要;如果你把Unicode字符翻译成字节,那是典型的,因为你要在网络上发送它们,或者你要处理一些其他类型的编码系统。

如果你是一个初学者,不想深入了解,可以用下面的命令安装一个叫做unidecode 的 Python 包。

它将直接把Unicode转换成ASCII;当你在一个需要把Unicode转换成ASCII的应用程序中工作时,它将会很有帮助。

>>pip install unidecode
>>>from unidecode import unidecode
>>>unidecode(u'北京')
'Bei Jing'