使用Python unicode的特殊字符问题

使用Python unicode的特殊字符问题,python,unicode,Python,Unicode,预期产出: 虽然其他物种(如马芒果、M.foetida)也在种植,但印度芒果——普通芒果或印度芒果——是谢菲尔德唯一的芒果树,价值92亿英镑。” 收到的输出: 当其他物种(如马芒果、M.foetida)也在生长时,芒果 icaΓôô普通芒果或印度芒果Γôôôô谢菲尔德ôô唯一的芒果树是va 嘲笑┬ú92亿 忽略句子的意思,主要的一点是它不能访问特殊字符,如“-”、“英镑”、“等。 我尝试设置sitecustomize.py文件,并使用其他编码(如ascii、utf-32、cp-500、iso88

预期产出: 虽然其他物种(如马芒果、M.foetida)也在种植,但印度芒果——普通芒果或印度芒果——是谢菲尔德唯一的芒果树,价值92亿英镑。”

收到的输出: 当其他物种(如马芒果、M.foetida)也在生长时,芒果 icaΓôô普通芒果或印度芒果Γôôôô谢菲尔德ôô唯一的芒果树是va 嘲笑┬ú92亿

忽略句子的意思,主要的一点是它不能访问特殊字符,如“-”、“英镑”、“等。 我尝试设置sitecustomize.py文件,并使用其他编码(如ascii、utf-32、cp-500、iso8859_15和utf-8)来设置此代码,但未能解决此问题。 很抱歉,我是python.Thanx新手,需要提前获得帮助。

看起来像这样。请尝试以下操作:

#!/usr/bin/env python
# -*- coding: utf_8 -*-

def splitParagraphIntoSentences(paragraph):

''' break a paragraph into sentences
    and return a list '''
    import re
# to split by multile characters

#   regular expressions are easiest (and fastest)
    sentenceEnders = re.compile('[.!?][\s]{1,2}(?=[A-Z])')
    sentenceList = sentenceEnders.split(paragraph, re.UNICODE)
    return sentenceList


if __name__ == '__main__':
p = "While other species (e.g. horse mango, M. foetida) are also grown ,Mangifera indica – the common mango or Indian mango – Sheffield’s only mango tree is valued at £9.2 billion."

sentences = splitParagraphIntoSentences(p)
for s in sentences:
    print s.strip()
这在Python 2.6中适用

import codecs, sys
sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
print u"valued at £9.2 billion."
应改为

p = "While other species..."
请注意引号前面的
u


您需要的是所谓的Unicode文本。在Python 2中,字符串文本默认情况下不是Unicode。

按照Nam的建议使用Unicode字符串文本是正确的,但是如果您的终端按照您的输出建议使用cp437代码页,它将无法显示您想要使用的某些Unicode字符。Windows控制台doesn不支持UTF-8,如果您在源文件中声明了
编码:UTF-8
1,并且不使用Unicode文本,则发送UTF-8。
编码:UTF-8
声明了源文件的编码,因此请确保您实际使用UTF-8编码保存源文件

当您使用Unicode文字时,Python将以声明的编码解释源字符串,并将其转换为Unicode字符串。当打印Unicode字符串时,Python将以终端编码对字符串进行编码,或者在缺少终端编码的情况下,对Python 2使用默认的
ascii
编码

例如:

p = u"While other species..."
输出
┬ú92亿
92亿英镑
谢菲尔德
谢菲尔德92亿英镑
回溯(最近一次呼叫最后一次):
文件“C:\Documents and Settings\metolone\Desktop\x.py”,第10行,在
打印u'SheffieldΓÖs'UnicodeEncodeError。
文件“C:\dev\python27\lib\encodings\cp437.py”,第12行,在encode中
返回编解码器.charmap\u encode(输入、错误、编码\u映射)
UnicodeEncodeError:“charmap”编解码器无法对位置9中的字符u'\u2019'进行编码:字符映射到
因此,不要期望在Windows控制台上正确打印所有Unicode。请使用支持UTF-8的Python IDE,例如PythonWin(可在扩展中获得)


要在Windows控制台中正确显示Unicode字符,需要两件事:映射要显示的Unicode字符的编码,以及支持这些字符的正确字形的字体。例如,如果将控制台代码页更改为Windows-1252(
chcp 1252
)将console字体改为ConsoleAS或Lucida console而不是光栅字体,如果您使用Unicode文字(
p=u“…”
),您的原始程序将正常工作。

已经找到了解决方案

下面的代码工作得很好

£9.2 billion
£9.2 billion
SheffieldΓÇÖs
Sheffield’s £9.2 billion
Traceback (most recent call last):
  File "C:\Documents and Settings\metolone\Desktop\x.py", line 10, in <module>
    print u'SheffieldΓÇÖs'  # UnicodeEncodeError.
  File "C:\dev\python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2019' in position 9: character maps to <undefined>

幸好您将编码指定为UTF-8。您认为这足以告诉Python您有Unicode,不是吗?将来,尝试将示例简化到最低限度。例如,不要要求读者向右滚动以查看文本,然后告诉他们忽略长句的含义,为什么不用一个简短的句子来说明错误/问题?…并给我们一个简短、自包含、正确的例子,正如您在上一个问题中所问的那样->@tchrist,我相信这类问题是Python 3中默认使用Unicode的原因。@tchrist,
coding:utf8
指定源文件的编码。这与此无关使用stdout.Thanx编码进行回复。尝试过这样做后,输出仍然相同。您使用什么来运行代码?在使用cp437的Windows控制台中,正确使用Unicode文本会导致UnicodeEncodeError,因为cp437仅支持£non ASCII字符,但不支持短划线或右单引号。请不要使用如果要在控制台中打印unicode,请使用Windows的cmd.exe!另一个技巧是使用
print(项目,)
项为unicode字符串。它不会按您的要求打印字符,但至少不会产生unicode错误。Thanx用于答复。尝试过这样做后,输出仍然相同。有关如何在Windows控制台中使用unicode,请参阅以下问题:
£9.2 billion
£9.2 billion
SheffieldΓÇÖs
Sheffield&#8217;s £9.2 billion
Traceback (most recent call last):
  File "C:\Documents and Settings\metolone\Desktop\x.py", line 10, in <module>
    print u'SheffieldΓÇÖs'  # UnicodeEncodeError.
  File "C:\dev\python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2019' in position 9: character maps to <undefined>
p = p.encode('utf-8') if isinstance(p,unicode)  else p