On the basis of the email from Martin, Aaron I changed the encoding logic in the function make_commit_message_template() - in the diff, if the line is an header is decoded as UTF8 - otherwise the line is decoded as bzrlib.user_encoding the rationale is that the message is already encoded as bzrlib.user_encoding during the writing. So the header which is know the encoding are correctly decoded. For the other data, the decoding is the same of one which is used during the file writing in order do minimize the encoding/decoding effect.
In order to move the user encoding at the UI level, the parameter user_encoding is added to the functions