【问题标题】:Character encoding error when writing url in FPDF2在 FPDF2 中写入 url 时出现字符编码错误
【发布时间】:2019-03-27 15:17:33
【问题描述】:

我正在使用 Python 3.7 并正在运行 FPDF 2.0.3 (https://pypi.org/project/fpdf2/) 的 python 端口。我正在使用很多 unicode 符号,其中一些符号需要成为 URL 的一部分。我可以毫无问题地将它们写成文本,但是当 unicode 符号成为我的 URL 的一部分时,我不断收到错误消息。

尝试使用 html.escape(str) 进行转义,但没有成功 重写代码以使用 write_html(html_as_str),这也不起作用

这是工作代码:

add = "Chronique d‘Égypte (CdE)" ##this is actually pulled in from a MYSQL query using PYMYSQL
from fpdf import FPDF
pdf = FPDF('P', 'mm', 'A4')
pdf.add_page()
pdf.add_font('base', '', r'C:\Fonts\DejaVuSans.ttf', uni=True)
pdf.set_font('base', '',12)
pdf.write(5, add)
pdf.output("goodfile.pdf", "F")

有了这个脚本,我得到了打印的字符串。但是我希望打印字符串并成为这样的 url 的一部分:

add = "Chronique d‘Égypte (CdE)" ##this is actually pulled in from a MYSQL query using PYMYSQL
from fpdf import FPDF
pdf = FPDF('P', 'mm', 'A4')
pdf.add_page()
pdf.add_font('base', '', r'C:\Fonts\DejaVuSans.ttf', uni=True)
pdf.set_font('base', '',12)
pdf.write(5, add, 'https://www.example.org/index.php?searchterm='+add)
pdf.output("goodfile.pdf", "F")

第二个脚本失败并在我的控制台中显示以下错误消息:

Traceback (most recent call last):
  File ".\print.py", line 543, in <module>
    pdf.output(Filename+'_CORPUS.pdf', 'F')
  File "C:\Users\me\AppData\Local\Programs\Python\Python37\lib\site-packages\fpdf\fpdf.py", line 1239, in output
    buffer = self.buffer.encode("latin1")
UnicodeEncodeError: 'latin-1' codec can't encode character '\u2018' in position 1587960: ordinal not in range(256)

错误消息本身非常混乱,因为添加导致错误的字符串的部分发生在第 470 行附近;而回溯只提到第 543 行。

我希望输出是我的 pdf 中的可点击链接,打开默认浏览器并使用 PDF 中的字符转到指定的 URL。我不能用普通的引号替换这个字符,因为它在那个网站上给了我其他(在这种情况下没有)结果。

另外,有人可以添加标签 FPDF2 来帮助正确分类吗?

【问题讨论】:

  • URL 可能应该以某种方式编码,但我们不知道您的服务器支持和期望哪种编码。一个合理的猜测是编码为 UTF-8 并对结果应用 URL 百分比编码;所以 "olé" 映射到 ol%C3%A9
  • 感谢 Tripleee;这确实是问题所在。我必须从 urllib 导入引号,例如:` From urllib.parse import quote`,然后在字符串周围使用引号,例如:` pdf.write(5, add, 'example.org/index.php?searchterm='+quote(add)) `

标签: python python-3.x pdf unicode


【解决方案1】:

我有同样的错误。我只是去 FPDF.py 并用 utf-8 替换所有 latin-1。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多