2

Unicode 文字で ReportLab を使用しようとしていますが、機能しません。次の行に到達するまで、コードをトレースしてみました。

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は、処理中の文字のコード ポイントが含まれています (たとえば、'A' の場合は 65、'a' の場合は 97、アラビア語の光沢 'Ø' の場合は 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、上記のエラーが発生します。

4

2 に答える 2

1

「機能しない」とはどういう意味ですか?reportlabのソースコードを誤って引用しました。実際に行っているのは、各16ビットUnicode文字の下位バイトと上位バイトが別々にコード化されていることです(上位バイトは変更されたときにのみ書き出されます。これは、ドキュメントを小さくするためのPDF固有の最適化であると思います)。

根本的な理由が何であるかではなく、問題が何であるかを正確に説明してください。表示したい文字が、選択したフォント('DejaVuSansMono-BoldOblique')に存在しない可能性があります。

于 2009-12-27T01:46:19.103 に答える
0

~unutbu が示唆しているように、4 バイトの Unicode 文字を使用するように変更0xFFする必要があると確信しているため、2 バイトではなく 4 バイトを使用します。0xFFFF

于 2009-10-20T14:05:53.533 に答える