【问题标题】:Unicode Encode Error 'latin-1' codec can't encode character '\u2019'Unicode 编码错误“latin-1”编解码器无法编码字符“\u2019”
【发布时间】:2018-12-11 22:32:41
【问题描述】:

我正在尝试从 MySQL RDB 创建数据的 CSV,以将其移至 Amazon Redshift。但是,其中一个字段包含描述,其中一些描述包含 ''' 字符或右单引号。在我运行代码之前,它会给我

UnicodeEncodeError: 'charmap' codec can't encode character '\x92' in position 62: character maps to <undefined>

然后我尝试使用 REPLACE 来尝试去掉正确的单引号。

db = pymysql.connect(host='host', port=3306, user="user", passwd="password", db="db", autocommit=True)
cur = db.cursor()
#cur.execute("call inv1_view_prod.`Email_agg`")

cur.execute("""select field_1, 
        field_2, 
        field_3, 
        field_4, 
        replace(field_4_desc,"’","") field_4_desc, 
        field_5, 
        field_6, 
        field_7 
from table_name """) 


emails = cur.fetchall()
with open('O:\file\path\to\file_name.csv','w') as fileout:
        writer = csv.writer(fileout)
        writer.writerows(emails)   
time.sleep(1)

但是,这给了我错误:

UnicodeEncodeError: 'latin-1' codec can't encode character '\u2019' in position 132: ordinal not in range(256)

我注意到 132 是 SQL 语句中右单引号的位置,所以我相信代码本身可能有问题。我尝试在 REPLACE 语句中使用常规的直撇号而不是右单引号,但是这并没有替换字符并且仍然返回原始错误。有谁知道为什么它不接受单引号以及如何解决它?

【问题讨论】:

  • 你为什么引用cur.execute ("""。那可能只是读取cur.execute(" cur.execute 字符串中的其他双引号也是不允许的(它会将它们视为字符串的结尾)。
  • 数据库表是否有文本编码 Latin-1 但不知何故包含非拉丁-1 字符?
  • 旁注:这段代码无论如何都会中断; 'O:\file\path\to\file_name.csv' 实际上是(用尖括号命名的特殊字符以使其清楚)O:&lt;form feed&gt;ile\path&lt;tab&gt;o&lt;form feed&gt;ile_name.csv。这就是为什么您总是对 Windows 路径使用原始字符串,例如r'O:\file\path\to\file_name.csv'(注意 r 前面的公开报价)。你可能会在你的真实路径上逃脱它(如果没有目录或文件名以响应 str 文字转义的字符开头),但这纯粹是运气;始终使用原始字符串,这样您就不必依赖运气了。

标签: python mysql csv unicode


【解决方案1】:

\u2019 的 Unicode,UTF-8 十六进制 E28099,这是一个“右单引号”。直接 latin1 等效项是十六进制 92。一些文字处理产品使用它而不是撇号 (')。

您收到错误消息,不是因为您无法处理字符,而是因为配置未能声明在哪里使用哪种编码。

“132”似乎无关紧要:132 84 E2809E „ &amp;#x84;

Python 注释:http://mysql.rjweb.org/doc.php/charcoll#python
关于其他字符集问题的说明:Trouble with UTF-8 characters; what I see is not what I stored

在不知道架构或 Python 配置的情况下,我无法更具体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2011-04-25
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多