Что нужно сделать, чтобы включить иностранные символы? - PullRequest
0 голосов
/ 15 февраля 2012

Я ищу способ включить иностранные символы в моих отчетах.В результате получается HTML, который я конвертирую в PDF, чтобы appengine отправлял электронное письмо в формате PDF.Выход не может обрабатывать int.например, символыОтвет: enter image description here

Код, который составляет отчет:

class Report(webapp2.RequestHandler):

    def get(self):
        # Create a conversion request from HTML to PDF.
        users = User.query()
        today = date.today()
        startdate = date(today.year, today.month, 1) # first day of month   
        html = None     
        for user in users: 
            if user.activity() > 0:
                logging.info('found active user %s %s' % (user.firstname, user.lastname))
                html = '<html><body><table border="1">'
                level = user.level()
                distributor = user
                while distributor.has_downline():
                    downline = User.query(User.sponsor == distributor.key).order(User.lastname).fetch()
                    for person in downline:  # to this for whole downline
                        orders = model.Order.all().filter('distributor_id =' , person.key.id()).filter('created >' , startdate).filter('status =', 'PAID').fetch(999999)
                        silver = 0
                        name = person.firstname +' '+ person.lastname
                        for order in orders:
                            logging.info('found orders')
                            for idx,item in enumerate(order.items):
                                purchase = model.Item.get_by_id(long(item.id()))
                                amount = int(order.amounts[idx])
                                silver = silver + amount*purchase.silver/1000.000 
                            if len(name) > 13:
                                name = name[13]
                            html = html + '<tr><td>' + str(order.created.date().day)+'/'+ str(order.created.date().month )+'</td><td>' + filters.makeid(person.key.id()) +'</td><td>' + name + '</td><td>' + str(order.key().id()) + '</td><td>' + str(silver) 
                            dist_level = order.dist_level
                            bonus = 0   
                            if level == 5 and dist_level == 4:                          
                                bonus = 0.05
                            if level == 5 and dist_level == 3:
                                bonus = 0.1
                            if level == 5 and dist_level == 2:
                                bonus = 0.13
                            if level == 5 and dist_level == 1:
                                bonus = 0.35

                            if level == 4 and dist_level == 3:                          
                                bonus = 0.05
                            if level == 4 and dist_level == 2:
                                bonus = 0.08
                            if level == 4 and dist_level == 1:
                                bonus = 0.3

                            if level == 3 and dist_level == 2:                          
                                bonus = 0.03
                            if level == 3 and dist_level == 1:
                                bonus = 0.25

                            if level == 2 and dist_level == 1:                          
                                bonus = 0.2

                            html = html + '</td><td>' + str(bonus) + '</td><td>' + str(order.total)
                            bonusmoney = bonus * float(order.total)
                            html = html + '</td><td>' + str(bonusmoney) + '</td></tr>'

                        distributor = person

                html = html + '</table>'

            asset = conversion.Asset("text/html", html, "test.html")
            conversion_obj = conversion.Conversion(asset, "application/pdf")        
            rpc = conversion.create_rpc()
            conversion.make_convert_call(rpc, conversion_obj)

            result = rpc.get_result()
            if result.assets:
                for asset in result.assets:
                    logging.info('emailing report')# to %s' % user.email)
                    message = mail.EmailMessage(sender='noreply@bnano.se',
                                    subject='Report %s %s' % (user.firstname, user.lastname))
                    message.body = 'Here is the monthly report'
                    message.to = 'niklasro@gmail.com'
                    message.bcc = 'fridge@koolbusiness.com'
                    message.attachments = ['report.pdf', asset.data]
                    message.send()
                    logging.info('message sent')

Что нужно сделать, чтобы включить в этом случае сторонние символы?Спасибо

Ответы [ 5 ]

3 голосов
/ 15 февраля 2012

Два священных правила для программирования Unicode:

  • Будьте уверены в том, что кодирует ваш ввод, и декодируйте его соответствующим образом.
  • Be явное того, что кодирует ваш вывод.

Ваш код, кажется, полагается на User.query, декодирующий ввод (иначе ваша сортировка не будет работать!), но он ничего не делаето втором пункте.Выполните следующие действия:

  • Убедитесь, что поля person.firstname действительно являются строками Unicode.Если вам нужно проверить содержимое, посмотрите шестнадцатеричное представление каждого символа;просто вывод строки вызывает автоматическое кодирование и скрывает исходное представление.Если они не являются строками Unicode, исправьте User.query .
  • Явно закодируйте ваш вывод как UTF-8, а явно пометьтевывод в кодировке UTF-8 (сделайте так, как предложил grodzik - это должно работать).

Просто добавьте кодировку = UTF8 к выводу может дать правильный конечный результат, ноэто чисто случайно, если у вас нет контроля над промежуточными данными.(Вы также заметите, что ваша сортировка отключена.)

1 голос
/ 15 февраля 2012

У меня был похожий опыт с моим кодом. Мой родной язык - исландский, поэтому в наших данных обычно много неанглоязычных символов. Именно в этот раз я проявил должную осмотрительность на всех фронтах, за исключением того, что сам файл .py был закодирован как utf-8, а не ansi, что по ряду причин привело к непредсказуемым результатам.

Так что если ничего не помогает, проверьте кодировку вашего документа и убедитесь, что он установлен в utf-8.

1 голос
/ 15 февраля 2012

Вы должны добавить <head> к html = '<html><body><table border="1">', в нем должен быть метатег: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Если кодировка utf-8 не поможет, возможно, подойдет iso-8859-x.

1 голос
/ 15 февраля 2012

похоже, что он обрабатывает их, но кодировка неправильная.вам может понадобиться что-то вроде name.decode ('utf-8'). encode ('latin-1')

конечно, я только догадываюсь о кодировках.

0 голосов
/ 16 февраля 2012

Возможно, вы захотите проверить модуль htmllib.htmlentitydefs . И не забудьте объявить кодировку в ваших формах ввода и страницах, чтобы гарантировать, что все данные закодированы равномерно или, по крайней мере, всегда знать об этом и действовать соответствующим образом.

...