[reportlab-users] Using TTFs with non-ASCII characters

Marius Gedminas reportlab-users@reportlab.com
Wed, 3 Jul 2002 11:42:22 +0200


On Wed, Jul 03, 2002 at 11:14:31AM +0200, Dinu Gherman wrote:
> Gherman <gherman@darwin.in-berlin.de>:
> 
> > > Fixed:
> > 
> > Works great! I've updated my sample file:
> 
> BTW, what is the canonical way to make non-ASCII characters 
> appear as expected in strings "automatically"?

Use UTF-8. ;)

> I've tried
> using something like this:
> 
>   c.drawString(100, y, u"äöüÄÖÜßé?")

Unicode strings are not present in Python 1.5.2.  With 2.0 or later you
can do

  c.drawString(100, y, any_unicode_string.encode("UTF-8"))

I'm not sure what happens if you write u"text in some 8-bit encoding" --
what encoding will be chosen by Python interpret those 8-bit characters?
To be safe you could write

  c.drawString(100, y, unicode("Latin-1 text", "ISO-8859-1").encode("UTF-8"))

It might be easier to use UTF-8 directly.

I wonder... is there a way to support Unicode string literals on Python
2+ in a way that's compatible with Python 1.5.2?  Basically you'd need
to change parse_utf8() in ttfonts.py to something like

  if type(string) is UnicodeType:
      return map(ord, string)

and above that declare

  try:
    from types import UnicodeType
  except:
    # Old Python has no Unicode strings
    UnicodeType = None

Not tested, but you get the idea.  Then you could just pass Unicode
strings to drawString if you have Python 2+.

(Platypus would need a couple of additional lines to cope with Unicode
strings.)


Marius Gedminas
-- 
Most security experts REALLY believe in firewalls. The expect that, when they
die, arrive at the great firewall in the sky where Saint Peter is running a
default policy of REJECT.
		--- Sander Plomp