Python line.replace返回UnicodeEncodeError

时间:2016-07-04 14:14:55

标签: python python-unicode

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

% Generated by Sphinx.
\documentclass[letterpaper,11pt,english]{sphinxmanual}
\usepackage[utf8]{inputenc}
\begin{document}

\chapter{Preface}
Krimson4 is a nice programming language.
Some umlauts äöüßÅö.
That is an “double quotation mark” problem.
Johnny’s apostrophe allows connecting multiple ports.
Components that include data that describe how they ellipsis …
Software interoperability – some dash – is not ok.
\end{document}

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

#!/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}') 

这适用于使用Python 2.7和Python 3.5的Ubuntu 16.04, 但它在使用Python 3.4的Windows上失败了。 我得到的错误信息是:

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 <undefined>

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

最后,我需要一个适用于Linux和Windows的Python 2.7和3.x解决方案。我在SO上尝试了很多解决方案,但是还找不到适合我的解决方案......

1 个答案:

答案 0 :(得分:2)

您需要使用encoding="the_encoding"指定正确的编码:

with open(oldFil, "rt", encoding="utf-8") as fin,  open(newFil, "wt", encoding="utf-8") as fout:

如果您没有使用首选编码。

open

在文本模式下,如果未指定编码,则使用的编码取决于平台:调用locale.getpreferredencoding(False)以获取当前的语言环境编码