未在python终端上显示西班牙语字符

未在python终端上显示西班牙语字符,python,encoding,utf-8,nltk,Python,Encoding,Utf 8,Nltk,我使用python从NLTK下载了西班牙语文本 spanish_sents=nltk.corpus.floresta.sents() 在终端中打印句子时,请使用相应的西班牙语字符 没有渲染。例如,打印西班牙语[1]会产生类似u'\xe9'的字符,如果我使用utf-8对其进行编码,如中所示 print [x.encode("utf-8") for x in sapnish_sents[1]] 它产生'\xc3\xa9'并以拉丁语3进行编码 print [x.encode("latin3")

我使用python从NLTK下载了西班牙语文本

spanish_sents=nltk.corpus.floresta.sents()
在终端中打印句子时,请使用相应的西班牙语字符 没有渲染。例如,打印
西班牙语[1]
会产生类似
u'\xe9'
的字符,如果我使用utf-8对其进行编码,如中所示

print [x.encode("utf-8") for x in sapnish_sents[1]] 
它产生
'\xc3\xa9'
并以拉丁语3进行编码

print [x.encode("latin3") for x in sapnish_sents[1]] 
它产生
'\xe9'


如何配置终端以打印这些点的图示符?谢谢

我想有一些事情正在发生。首先,您正在迭代一个
str
sapnish_sents[1]
是一个完整的条目吗?打印该条目时会发生什么情况)。其次,您没有获得完整字符,因为您正在迭代
str
(unicode字符比ASCII字符占用更多的“空间”,因此寻址单个索引看起来很奇怪)。第三,当您可能打算
解码时,您正在尝试
编码

试试这个:

 print sapnish_sents[1].decode('utf-8')
我刚刚在终端中运行了以下命令,以帮助提供上下文:

>>> a = '®†\¨ˆø' # Storing non-ASCII characters in a str is ill-advised;
                 # I do this as an example because it's what I think your question is
                 # really asking
>>> a # a now looks like a bunch of gibberish if I just output
'\xc2\xae\xe2\x80\xa0\\\xc2\xa8\xcb\x86\xc3\xb8'
>>> print a # Well, this looks normal.
®†\¨ˆø
>>> print repr(a) # Just demonstrating how the above works
'\xc2\xae\xe2\x80\xa0\\\xc2\xa8\xcb\x86\xc3\xb8'
>>> a[0] # We're only looking at one character, which is represented by all this stuff.
'\xc2' 
>>> print a[0] # But because it's not a complete unicode character, the terminal balks
?
>>> print a.decode('utf-8') # Look familiar?
®†\¨ˆø
>>> print a.decode('utf-8')[0] # Our first character!
®

我的猜测是有一些事情正在发生。首先,您正在迭代一个
str
sapnish_sents[1]
是一个完整的条目吗?打印该条目时会发生什么情况)。其次,您没有获得完整字符,因为您正在迭代
str
(unicode字符比ASCII字符占用更多的“空间”,因此寻址单个索引看起来很奇怪)。第三,当您可能打算
解码时,您正在尝试
编码

试试这个:

 print sapnish_sents[1].decode('utf-8')
我刚刚在终端中运行了以下命令,以帮助提供上下文:

>>> a = '®†\¨ˆø' # Storing non-ASCII characters in a str is ill-advised;
                 # I do this as an example because it's what I think your question is
                 # really asking
>>> a # a now looks like a bunch of gibberish if I just output
'\xc2\xae\xe2\x80\xa0\\\xc2\xa8\xcb\x86\xc3\xb8'
>>> print a # Well, this looks normal.
®†\¨ˆø
>>> print repr(a) # Just demonstrating how the above works
'\xc2\xae\xe2\x80\xa0\\\xc2\xa8\xcb\x86\xc3\xb8'
>>> a[0] # We're only looking at one character, which is represented by all this stuff.
'\xc2' 
>>> print a[0] # But because it's not a complete unicode character, the terminal balks
?
>>> print a.decode('utf-8') # Look familiar?
®†\¨ˆø
>>> print a.decode('utf-8')[0] # Our first character!
®

您看到的是字符串的表示,因为打印列表仅用于调试目的

要打印列表,请使用
.join

print ', '.join(sapnish_sents[1])

您看到的是字符串的表示,因为打印列表仅用于调试目的

要打印列表,请使用
.join

print ', '.join(sapnish_sents[1])

仅仅是一个初步的评论,拉丁文3或确实表示为南欧语,但它的目的是涵盖土耳其语,马耳他语和世界语。西班牙语更常用拉丁语1(ISO-8859-1或西欧)或拉丁语9(ISO-8859-15)编码

我可以确认字母
é
具有unicode代码点U+00E9,并且在拉丁语1和拉丁语3中表示为
'\xe9'
。它在UTF8中编码为
'\xc3\xc9'
,因此所有转换都是正确的

但真正的问题是我如何配置我的终端?如果不知道终端是什么,很难回答

  • 如果它是真正的电传打字机或旧的vt100,没有重音字符:你不能(但我不认为你使用它…)
  • 如果您使用Windows控制台,请声明代码页1252(非常接近拉丁文1):
    chcp 1252
    并使用拉丁文1编码(或者更好的
    'cp1252'
  • 如果您在Linux或任何其他Unix或类似Unix上使用xterm(或任何衍生工具),请使用
    export LANG=en_US.utf8
    声明utf8字符集(如果您不喜欢美式英语,请选择您自己的语言,这里有趣的部分是
    .utf8
    ),并使用utf8编码-或者声明iso-8859-1字符集(
    export LANG=en_US.ISO-8859-1
    )并使用拉丁编码

只是一个初步的注释,拉丁文3或确实表示为南欧语,但它的设计涵盖了土耳其语、马耳他语和世界语。西班牙语更常用拉丁语1(ISO-8859-1或西欧)或拉丁语9(ISO-8859-15)编码

我可以确认字母
é
具有unicode代码点U+00E9,在拉丁语1和拉丁语3中表示为
'\xe9'
。在UTF8中,它被编码为
'\xc3\xc9'
,因此所有转换都是正确的

但真正的问题是如何配置我的终端…?如果不知道终端是什么,很难回答

  • 如果它是真正的电传打字机或旧的vt100,没有重音字符:你不能(但我不认为你使用它…)
  • 如果您使用Windows控制台,请声明代码页1252(非常接近拉丁文1):
    chcp 1252
    并使用拉丁文1编码(或者更好的
    'cp1252'
  • 如果您在Linux或任何其他Unix或类似Unix上使用xterm(或任何衍生工具),请使用
    export LANG=en_US.utf8
    声明utf8字符集(如果您不喜欢美式英语,请选择您自己的语言,这里有趣的部分是
    .utf8
    ),并使用utf8编码-或者声明iso-8859-1字符集(
    export LANG=en_US.ISO-8859-1
    )并使用拉丁编码

OPs文本似乎已经是unicode字符串了(请参见
u'\xe9'
),因此解码这是一个令人困惑的建议。我认为这是一个非常糟糕的做法(对新手来说也是非常困惑的)创建带有非ASCII字符的字节字符串,如“®†\ˆø”。我想不出这样做是正确的。如果是文本,则创建unicode字符串(
u'
)。@lenz OP的注释表明它们具有
str(u'))
,而不是
u'\xe9'
。这意味着他们正在对
str
进行切片,从而得到不可靠的结果。他们需要将其转换为unicode对象,以便在索引中获得完整的值。@lenz尝试将unicode存储在
str
中是一种可怕的做法。这就是为什么
str
在Py3k中成为unicode的原因。然而,since看起来这正是OP正在做的,这个例子试图说明他为什么会得到这个结果。@lenz,第一段解释了我的两个评论,顺便说一句。OPs文本似乎已经是unicode字符串了(请参见
u'\xe9'
),所以解码这是一个令人困惑的建议。我认为这是一个非常糟糕的做法(对新手来说非常困惑)创建带有非ASCII字符的字节字符串,如“®†\ˆø”。我想不出这样做是正确的用例。创建unicode字符串