Odoo Python 2.7 Кодировка utf8 - PullRequest
       38

Odoo Python 2.7 Кодировка utf8

1 голос
/ 01 октября 2019

Я пытаюсь создать строку в юникоде из нескольких полей. Я делаю:

my_unicode_text = u' '.join((u'ID ',str(order_line.product_id.id),u' | [',order_line.product_id.code,u'] ',str(order_line.product_id.name),u' | ',str(order_line.product_uom_qty),u'<br/>')).encode('utf-8').strip())

Но я получаю:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xd3' in position 18: ordinal not in range(128)

Я предполагаю, что я не правильно использую join / str.

Ответы [ 2 ]

1 голос
/ 01 октября 2019

encode используется для перехода от unicode к str, а не к обратному, означает преобразование unicode в bytes (str в Python 2.x):

# -*- coding: utf-8 -*-
s = u'aller â'
print(type(s))
print(type(s.encode('utf-8')))  # convert to str but using utf-8 codec
print(s + str(1))  # unicode + str == unicode
print(str(s))  # generate an exception because its using `ascii` codec by default

так что в вашем примере название продукта все готово utf-8 unicode не нужно вообще его преобразовывать, просто конвертируйте не строковый объект, такой как Integers, Floats.

my_unicode_text = u' '.join(
    (u'ID ',
     str(order_line.product_id.id),  # Integer
     u' | [',
     order_line.product_id.code,
     u'] ',
     order_line.product_id.name,  # utf-8 uncide (database encoding)
     u' | ',
     str(order_line.product_uom_qty),  # floats
     u'<br/>'))

, но вместо использования соединения используйте строкуформатирование и преобразование значения вручную:

my_unicode_text = u'ID {order_line.product_id.id} | [{order_line.product_id.code}] ' \
              u'{order_line.product_id.name} | {order_line.product_uom_qty}<br/>'.format(order_line=order_line)
1 голос
/ 01 октября 2019

Возможно, если вы замените объединение в формате:

class Product_id:
    def __init__(self, id, code, name):
        self.id, self.code, self.name = id, code, name

class Order_line:
    def __init__(self, product_id, product_uom_qty):
        self.product_id, self.product_uom_qty = product_id, product_uom_qty


order_line = Order_line(Product_id(42, 6789, u'\N{greek small letter beta}eer'), 6)

s = unicode.format(u'ID {order_line.product_id.id} | [{product_id.code}] {product_id.name} | {order_line.product_uom_qty}<br/>', order_line=order_line, product_id=order_line.product_id)

print s
...