Python line.replace返回UnicodeEncodeError

16 浏览
0 Comments

Python line.replace返回UnicodeEncodeError

我有一个tex文件,是使用Sphinx从rst源文件生成的,它以UTF-8编码,没有BOM(根据Notepad++),命名为final_report.tex,内容如下:

% 由Sphinx生成。
\documentclass[letterpaper,11pt,english]{sphinxmanual}
\usepackage[utf8]{inputenc}
\begin{document}
\chapter{前言}
Krimson4是一种不错的编程语言。
一些umlauts äöüßÅö。
这是一个“双引号”问题。
Johnny的撇号允许连接多个端口。
包含描述省略号的数据的组件...
软件互操作性 - 一些破折号 - 不可以。
\end{document}

现在,在将tex源文件编译为pdf之前,我想替换tex文件中的一些行以获得更好的结果。我的脚本受到了另一个SO问题的启发。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
newFil=os.path.join("build", "latex", "final_report.tex-new")
oldFil=os.path.join("build", "latex", "final_report.tex")
def freplace(old, new):
    with open(newFil, "wt", encoding="utf-8") as fout:
        with open(oldFil, "rt", encoding="utf-8") as fin:
            for line in fin:
                print(line)
                fout.write(line.replace(old, new))
    os.remove(oldFil)
    os.rename(newFil, oldFil)
freplace('\documentclass[letterpaper,11pt,english]{sphinxmanual}', '\documentclass[letterpaper, 11pt, english]{book}') 

这在Ubuntu 16.04上使用Python 2.7和Python 3.5上工作,但在Windows上使用Python 3.4时失败了。我收到的错误消息是:

File "C:\Python34\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 '\u201c' in position 11: character maps to

其中201c代表左双引号。如果我删除有问题的字符,脚本会继续执行,直到找到下一个有问题的字符为止。

最后,我需要一个在Linux和Windows上使用Python 2.7和3.x都能正常工作的解决方案。我尝试了很多在SO上提出的解决方案,但还没有找到适合我的。

0
0 Comments

Python中的line.replace返回UnicodeEncodeError的问题是因为没有正确指定编码。解决方法是在打开文件时使用encoding="the_encoding"参数来指定正确的编码,例如:with open(oldFil, "rt", encoding="utf-8") as fin, open(newFil, "wt", encoding="utf-8") as fout:。如果没有指定编码,将使用默认的编码,具体取决于操作系统的设置。文本模式下,如果未指定编码,则会调用locale.getpreferredencoding(False)来获取当前的locale编码。

如果仍然遇到编码问题,说明数据不是以utf-8编码。需要确保已将编码设置为utf-8,并且错误发生在写入操作上。

如果第一个错误已经修复,但仍然出现UnicodeEncodeError错误,可能是因为sys.stdout.encoding不支持显示Unicode字符。可以尝试删除用于调试的print()语句,这样其他错误就会消失。可以通过sys.stdout.encoding属性来获取当前的编码,如果编码不支持显示Unicode字符,则需要寻找其他方法来打印输出。

对于Python 2,需要使用io库中的io.open来代替open函数。可以根据Python的版本来选择使用不同的函数。在Python 3中,open函数已经等同于io.open,所以代码可以不做修改同时适用于Python 2.7和Python 3。

总结起来,解决Python中line.replace返回UnicodeEncodeError的问题可以通过指定正确的编码来解决,并且需要注意在Python 2中使用io.open代替open函数。

0