【问题标题】:Codec python list编解码器python列表
【发布时间】:2017-03-15 01:38:32
【问题描述】:

我创建了一些带有特殊字符的列表。但是,当我打印这些列表时,编解码器中出现了一些错误。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

#My lists
geometriaAproximada = ['Sim', 'Não'];
regime = ['Permanente', 'Permanente com grande variação', 'Temporário', 
                'Temporário com leito permanente', 'Seco'];
tipomassadagua = ['Oceano', 'Baía', 'Enseada', 'Meandro abandonado', 
                            'Lago/Lagoa', 'Represa/Açude', 'Desconhecida'];
vegetacao_nivel_1 = ['Manguezal', 'Restinga', 'Brejo Litoraneo', 'Mussununga', 
                                'Vegetação com influência fluvial e/ou lacustre', 'Compo Rupestre'
                                'Floresta Estacional', 'Cerrado', 'Caatinga', 'Áreas Antropizadas',
                                'Rios, Lagos, Lagoas, e Corpos d''água'];
vegetacao_nivel_2 = ['Arbustiva/Arbórea', 'Apicum', 'Herbáceo-Arbustivo', 'Arbustiva', 'Herbácea', 
                                'Terras baixas', 'Aluvial' 'de Altitude (Submontana ou Montana)', 'Decidual', 'Semidecidual'
                                'Tipo biogeográfico de Cerrado', 'Tipo biogeográfico de Caatinga'];
vegetacao_nivel_3 = ['Estágio secundário inicial de regeneração', 
                                'Estágio secundário médio de regeneração', 
                                'Estágio primário e/ou secundário avançado de regeneração', 
                                'Mata de Cipó', 'Terras baixas', 'de Altitude (Submontana/Montana)', 'Aluvial', 
                                'Florestado (Cerradão)',  'Arborizado (Stricto sensu)', 'Parque (Campo cerrado)', 'Campo Limpo',
                                'Vereda', 'Floresta de galeria',
                                'Florestada', 'Arborizada', 'Parque', 'Gramínio-lenhosa'];

当我打印其中的某个人时:

print regime

['Permanente', 'Permanente com grande varia\xc3\xa7\xc3\xa3o', 'Tempor\xc3\xa1rio', 'Tempor\xc3\xa1rio com leito permanente', 'Seco']

我能做些什么来纠正它?

【问题讨论】:

  • 把大部分例子拿出来,集中在一个短名单上怎么样?
  • print 只能打印文本。如果您给出不同的内容,那么它会尝试将其转换为 unambiguous 字符串 - 例如,如果它是列表,那么它会添加 []、配额标记(用于字符串)并使用十六进制代码本机字符向您展示使用了什么精确编码 - 所以这不是错误,而是故意的行为。如果您需要正确的文本,您必须自己将列表转换为字符串。
  • 也可能是其他问题 - print 自动尝试将文本转换为控制台使用的编码。如果控制台不使用 UTF-8,那么有时您会看到十六进制代码而不是 unicode 字符。

标签: python python-2.7 list codec


【解决方案1】:

在语言成熟后,Unicode 被固定在 python 2 上。 str 对象尤其可以保存二进制编码数据或 ascii 字符串数据,您只需要知道程序中的哪个是哪个。 unicode 类型是后来添加的,它可以满足您的期望 - 它包含能够表达 unicode 代码集的宽文本字符。

为了让事情变得混乱,您的控制台和文本编辑器可能原生支持 utf-8,因此包含编码 utf-8 八位字节的字符串在您查看时可能看起来正确。这两个字符串看起来一样,但repr 告诉我们它们是不同的。第一个需要解码为python unicode字符串

>>> s = 'Permanente com grande variação'
>>> u = u'Permanente com grande variação'
>>> print repr(s)
'Permanente com grande varia\xc3\xa7\xc3\xa3o'
>>> print repr(u)
u'Permanente com grande varia\xe7\xe3o'
>>> s_decode = s.decode('utf-8')
>>> print repr(s_decode)
u'Permanente com grande varia\xe7\xe3o'

所以,问题的第一部分通过将字符串编写为 unicode 来解决。

u'Permanente com grande variação'

第二个问题是当你打印一个列表时,python 会打印它的成员的repr,你的字符串仍然会显示编码字符。这并不需要修复——这只是 python 打印列表的正常方式。如果你想要更整洁的东西,你必须构建自己的输出,如

>>> mylist = [u'Permanente com grande variação', u'Vegetação com influência']
>>> print mylist
[u'Permanente com grande varia\xe7\xe3o', u'Vegeta\xe7\xe3o com influ\xeancia']
>>> print u', '.join(mylist)
Permanente com grande variação, Vegetação com influência

最后,python 3 已经推出很长时间了,不会说英语的人应该特别高兴它在处理国际字符集方面做得很好。

Python 已死……Python 万岁!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多