python 3.2 UnicodeEncodeError: 'charmap'编解码器无法将字符'\u2013'在位置9629编码:字符映射为

11 浏览
0 Comments

python 3.2 UnicodeEncodeError: 'charmap'编解码器无法将字符'\u2013'在位置9629编码:字符映射为

我正在尝试编写一个脚本,从sqlite3数据库中获取数据,但是我遇到了一个问题。

数据库中的字段是文本类型,并包含格式化的HTML文本。请参见下面的文本:



Yahoo!



...

而尝试提取数据的Python代码如下:

>>> import sqlite3
>>> conn = sqlite3.connect('C:/temp/Mobils/export/com.yahoo.mobile.client.android.mail/databases/mail.db')
>>> c = conn.cursor()
>>> conn.row_factory=sqlite3.Row
>>> c.execute('select body from messages_1 where _id=7')

>>> r = c.fetchone()
>>> r.keys()
['body']
>>> print(r['body'])
Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Python32\lib\encodings\cp850.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2013' in position 9629: character maps to 
>>>

有人知道如何将其打印/写入文件吗?是的,我知道这是打印到stdout,但是当我尝试写入文件时,我遇到了相同的UnicodeEncodeError。我尝试了文件对象的write方法和print(r['body'], file=f)

0
0 Comments

文章标题:Python 3.2 UnicodeEncodeError: 'charmap' codec can't encode character '\u2013'的原因和解决方法

最近我遇到了一个问题,就是在使用Python 3.2版本时出现了UnicodeEncodeError: 'charmap' codec can't encode character '\u2013' in position 9629: character maps to 的错误。经过一番查询和尝试,我总结出了以下的原因和解决方法。

在Windows操作系统上,控制台的编码器默认是无法表示所有Unicode字符的,因此当遇到无法表示的字符时就会出现上述错误。解决这个问题的方法是将控制台的编码器修改为能够表示你的数据的编码器,比如utf-8。然后将输出重定向到sys.stdout。

具体的操作步骤如下:

首先,在控制台中运行以下命令:

chcp 65001
set PYTHONIOENCODING=utf-8

然后,启动Python并进行你想要的操作。

如果想要在脚本开始时设置这个编码器,我目前还不清楚是否有办法。你可以参考这个链接:stackoverflow.com/questions/492483/…,可能会有所帮助。

这种方法在Windows上解决了我的问题。由于我同时使用了ConEmu和git-bash,所以我将上述命令添加到了我的~/.basrhc文件中,具体形式如下:

export ConEmuDefaultCp=65001
export PYTHONIOENCODING=utf-8

在git-bash中,你需要使用export命令代替set命令;在ConEmu中,环境变量ConEmuDefaultCP的功能类似于这个答案中的chcp命令。

此方法还可以解决在使用Fabric和pip install命令时遇到的类似问题。我在Windows PowerShell上运行fab deploy命令时,这个方法真的解决了我的问题,非常感谢!

值得一提的是,从Python 3.6版本开始,不再需要使用chcp命令来获得控制台的完全Unicode支持,具体可参考PEP 528。然而,如果你希望将输出重定向到文件时使用UTF-8编码,仍然可能需要使用PYTHONIOENCODING这个环境变量。

以上就是关于Python 3.2 UnicodeEncodeError: 'charmap' codec can't encode character '\u2013'的原因和解决方法的总结。希望对遇到类似问题的人有所帮助。

0
0 Comments

问题的出现原因是使用了不支持某些字符的编码(charmap),解决方法是使用支持所有字符的编码(如utf-8),同时注意输出到stdout的情况下可能还需要绕过控制台I/O来支持真正的Unicode。

当你打开要写入的文件时,使用一个可以处理所有字符的特定编码来打开它。

with open('filename', 'w', encoding='utf-8') as f:
    print(r['body'], file=f)

这解决了一半的问题,将内容打印到文件中。但它并没有解决另一半的问题,即打印到stdout,这与连接到cp850 Windows控制台有关。

这个解决方法基本可行。现在它将数据库内容打印到一个文件中,但每个字符都在新的一行,导致生成的文件无法被浏览器解释。

当你在2013年写下你的评论时,这个解决方法还不可用,但现在你可以使用Python 3.6或更高版本。它绕过了控制台I/O以支持真正的Unicode。

0
0 Comments

Python 3.2 UnicodeEncodeError: 'charmap' codec can't encode character '\u2013' in position 9629: character maps to 问题的出现的原因是Python 3中使用了Unicode,但是Windows控制台或POSIX tty不支持Unicode。所以当你使用print或者将Unicode字符串发送到stdout时,Python需要对其进行编码。错误信息间接地告诉你Python尝试使用的字符集是cp850。你可以通过'\u2013'.encode('cp850')来测试这个字符集是否包含适当的字符,或者在网上查找cp850的相关信息。

可能是Python猜测错误,你的控制台实际上是设置为UTF-8。在这种情况下,只需手动设置sys.stdout.encoding='utf-8'。也有可能是你本意是将控制台设置为UTF-8但是做错了操作。在这种情况下,你可能需要在superuser.com上寻求帮助。

但是,如果没有问题,你将无法打印该字符。你需要使用非严格的错误处理程序手动对其进行编码。例如:

>>> '\u2013'.encode('cp850')

UnicodeEncodeError: 'charmap' codec can't encode character '\u2013' in position 0: character maps to

>>> '\u2013'.encode('cp850', errors='replace')

b'?'

那么,如何打印无法在控制台上打印的字符串呢?

你可以将每个print函数替换为以下代码:

>>print(r['body'].encode('cp850', errors='replace').decode('cp850'))

?

...但是这样做会变得非常乏味。

简单的方法就是设置sys.stdout上的错误处理程序:

>>sys.stdout.errors = 'replace'

>>print(r['body'])

?

对于打印到文件,情况基本相同,只是你不必在事后设置f.errors,你可以在构造时设置它。不是这样:

with open('path', 'w', encoding='cp850') as f:

这样做:

with open('path', 'w', encoding='cp850', errors='replace') as f:

或者,如果你可以使用UTF-8文件,就像Mark Ransom的答案所示,只需这样做:

with open('path', 'w', encoding='utf-8') as f:

我尝试了你的建议,错误消失了,但文件中的文本每行打印一个字符,这导致浏览器无法正确解析文件。有什么解决方法或原因吗?我在错误中说cp1252.py文件被使用,所以我将编码从cp850更改为cp1252,但原则应该是相同的对吗?

是的,对于任何没有完全覆盖Unicode的编解码器(基本上是除了utf-8和utf-7之外的所有编解码器),原则都是相同的。我很好奇你是如何在这里粘贴错误时得到cp850的,如果你真正使用的是cp1252。你从哪里复制和粘贴这个错误消息的?

同时...每行只有一个字符的最常见原因是将字符串视为代码中的字符串序列。 (字符串是一个由1个字符字符串组成的序列,所以它是有效的,但不是你希望的方式。)但是我们必须看到相关的代码才能帮助你调试。而且这几乎肯定是一个完全独立的问题,所以你可能应该创建一个新问题。

举个例子,你可能会遇到这个每行一个字符的问题...如果你做的是bodies = [row['body'] for row in c.fetchall()]然后是for body in bodies: print(body),这是正确的。但是如果你做的是bodies = c.fetchone()['body']然后是for body in bodies: print(body),它会逐个字符地给你输出。

我从我在控制台中重新创建的较小的示例代码中获得了错误消息。

谢谢,那我想问题出在哪里。我有一个接受文件和要打印的内容的print函数,它假设它是一个元组。for循环将变成你示例中的最后一个for循环。

谢谢,问题解决了,通过将['body']转换为元组,解决了每行一个字符的问题。

这听起来正确。你的代码假设一个字符串元组,但只得到一个字符串,所以它会将字符串视为一个字符的元组。很高兴你解决了这个问题。

0
Yahoo! Mail