Skip to main content
 首页 » 编程设计

python之ReportLab 中的 Unicode 处理

2025年05月04日10mate10pro

我正在尝试将 ReportLab 与 Unicode 字符一起使用,但它不起作用。我尝试跟踪代码,直到到达以下行:

class TTFont: 
    # ... 
    def splitString(self, text, doc, encoding='utf-8'): 
        # ... 
        cur.append(n & 0xFF) # <-- here is the problem! 
        # ... 

(此代码可以在 ReportLab 的存储库中找到,在文件 pdfbase/ttfonts.py 中。有问题的代码在第 1059 行。)

为什么 n 的值被操纵了?

在上面显示的行中,n 包含正在处理的字符的代码点(例如,65 代表“A”,97 代表“a”,或 1588 代表阿拉伯语光泽“Í”)。 cur 是一个列表,其中填充了要发送到最终输出 (AFAIU) 的字符。在该行之前,一切(显然)工作正常,但在这一行中,n 的值被操纵,显然将其减少到扩展的 ASCII 范围!

这会导致非 ASCII、Unicode 字符丢失它们的值。我无法理解此声明有何用处或为何有必要!

所以我的问题是,为什么 n 的值在这里被操纵,我应该如何着手解决这个问题?

编辑:
为了回应有关我的代码片段的评论,这里是导致此错误的示例:

my_doctemplate.build([Paragraph(bulletText = None, encoding = 'utf8', 
    caseSensitive = 1, debug = 0, 
    text = '\xd8\xa3\xd8\xa8\xd8\xb1\xd8\xa7\xd8\xac', 
    frags = [ParaFrag(fontName = 'DejaVuSansMono-BoldOblique', 
        text = '\xd8\xa3\xd8\xa8\xd8\xb1\xd8\xa7\xd8\xac', 
        sub = 0, rise = 0, greek = 0, link = None, italic = 0, strike = 0, 
        fontSize = 12.0, textColor = Color(0,0,0), super = 0, underline = 0, 
        bold = 0)])]) 

在PDFTextObject._textOut中,调用_formatText,将字体标识为_dynamicFont,并相应调用font.splitString,这是导致上述错误的原因。

请您参考如下方法:

“不工作”是什么意思?您错误地引用了 reportlab 源代码。它实际上在做的是,每个 16 位 unicode 字符的低字节和高字节是分开编码的(高字节只有在它改变时才写出来,我认为这是一个 PDF 特定的优化,使文档更小)。

请准确解释问题是什么,而不是您认为根本原因是什么。很可能您要显示的字符根本不存在于所选字体中(“DejaVuSansMono-BoldOblique”)。