2009-10-20 3 views
1

유니 코드 문자와 함께 ReportLab을 사용하려고하는데 작동하지 않습니다.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는 문자의 코드 포인트 (예를 들어, 65 'A'에 대한, 97 'A'에 대한, 또는 1,588 아랍어 윤기를 들어 'ش') 처리중인 포함한다. cur은 최종 출력 (AFAIU)으로 보낼 문자로 채워지는 목록입니다. 그 라인 이전에, 모든 것이 (명백하게) 잘 동작했지만,이 라인에서 n의 값이 조작되어 분명히 확장 된 ASCII 범위로 축소되었습니다!

이로 인해 ASCII가 아닌 유니 코드 문자의 값이 손실됩니다. 나는이 진술이 어떻게 유용하며 왜 필요한지 이해할 수 없다!

그럼 내 질문에 n의 값이 조작되고 왜이 문제를 해결해야합니까?

편집 : PDFTextObject._textOut에서

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)])]) 

, _formatText를 호출, _dynamicFont로 글꼴을 식별 : 내 코드에 관한 의견에 대한 응답으로
, 여기에이 오류가 발생하는 예이다 위의 오류를 일으키는 font.splitString을 호출합니다.

+1

ReportLab은 실제로 유니 코드 텍스트를 지원합니다. 예상치 못한 결과를 제공하는 자체 포함 된 코드 스 니펫을 게시하여 문제의 원인을 파악하십시오. (당신이 가리키는 코드는 저에게 좋은 포스트 스크립트 자료와 함께 낮은 충실도의 스트림으로 텍스트의 ASCII 표현을 생성하는 것과 관련된 것으로 보입니다). –

+0

0xFF에서 0xFFFF로 변경하면 어떻게됩니까? – unutbu

답변

1

"작동하지 않는다"는 것은 무엇을 의미합니까? reportlab 소스 코드를 잘못 인용했습니다. 실제로 수행하는 작업은 각 16 비트 유니 코드 문자의 하위 바이트와 상위 바이트가 별도로 코딩된다는 것입니다 (상위 바이트는 변경 될 때만 쓰여지며, 문서를 더 작게 만들기위한 PDF 별 최적화라고 가정합니다).

인 이유를 정확히 설명해주십시오. 근본적인 원인이 무엇이라고 생각하지 않습니다. 선택한 글꼴에 표시하지 않을 가능성이 있습니다 ('DejaVuSansMono-BoldOblique').

+0

감사. 당신 말이 맞아요. 조금 더 일찍 이것을 이해했지만이 질문을 잊어 버렸습니다. –

0

0xFFFF으로 변경해야합니다 ~ unutbu가 제안한대로 4 바이트 유니 코드 문자를 사용해야하므로 2 바이트 대신 4 바이트를 사용합니다.