encode is used to go from unicode to str not the inverse, means converting unicode to bytes (str in 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
so in your example product name is all ready a utf-8 unicode no need to convert it at all just convert non string object like 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/>'))
but instead of using join use string formating and manually convert value:
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)