UnicodeEncodeError: кодек «latin-1» не может кодировать символ «\ u2013» (запись в PDF) - PullRequest
0 голосов
/ 25 июня 2019

У меня проблема с Unicode с переменным содержимым при записи в .pdf с python.

Это выводит эту ошибку:

UnicodeEncodeError: 'latin-1' codec can't encode character '\u2013'

Что, в принципе, попадает в тире?

Я попытался взять эту переменную, где содержимое имеет 'em dash', и переопределил его с помощью '.encode('utf-8')', например, то есть ниже:

Body = msg.Body

BodyC = Body.encode('utf-8')

А теперь я получаю ошибку ниже:

Traceback (most recent call last):
  File "script.py", line 37, in <module>
    pdf.cell(200, 10, txt="Bod: " + BodyC,  ln=4, align="C")
TypeError: can only concatenate str (not "bytes") to str

Ниже приведен мой полный код, как я могу просто исправить ошибку Unicode в содержимом переменной 'Body'.

Преобразование в utf-8 или western, что угодно, кроме '1025 *. Есть предложения?

Полный код:

from fpdf import FPDF
import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
msg = outlook.OpenSharedItem(r"C:\User\language\python\Msg-To-PDF\test_msg.msg")

print (msg.SenderName)
print (msg.SenderEmailAddress)
print (msg.SentOn)
print (msg.To)
print (msg.CC)
print (msg.BCC)
print (msg.Subject)
print (msg.Body)

SenderName = msg.SenderName
SenderEmailAddress = msg.SenderEmailAddress
SentOn = msg.SentOn
To = msg.To
CC = msg.CC
BCC = msg.BCC
Subject = msg.Subject
Body = msg.Body
BodyC = Body.encode('utf-8')

pdf = FPDF()
pdf.add_page()

# pdf.add_font('DejaVu', '', 'DejaVuSansCondensed.ttf', uni=True)
pdf.set_font("Helvetica", style = '', size = 11)
pdf.cell(200, 10, txt="From: " + SenderName, ln=1, align="C")
# pdf.cell(200, 10, border=SentOn, ln=1, align="C")
pdf.cell(200, 10, txt="To: " + To, ln=1, align="C")
pdf.cell(200, 10, txt="CC: " + CC, ln=1, align="C")
pdf.cell(200, 10, txt="BCC: " + BCC, ln=1, align="C")
pdf.cell(200, 10, txt="Subject: " + Subject, ln=1, align="C")
pdf.cell(200, 10, txt="Bod: " + BodyC,  ln=4, align="C")

pdf.output("Sample.pdf")
  • Как я могу изменить 'latin1'?

  • В любом случае, просто глобально исправить эти проблемы?

1 Ответ

1 голос
/ 05 июля 2019

Обходной путь - преобразовать весь текст в кодировку latin-1 перед передачей его в библиотеку. Вы можете сделать это с помощью следующей команды:

text2 = text.encode('latin-1', 'replace').decode('latin-1')

text2 будет свободен от любых нелатинских символов-1. Однако некоторые символы могут быть заменены на ?

...