2016-05-06 2 views
0

Так что я кодирую что-то в python, и я не могу найти anyfix для этого в любом месте. поэтому каждый раз, когда я получаю что-то вроде этого:Python 3: Byte issue

\xe2\x9d\xa4

мой код в данный момент для печати на консоли:

log = "Message: " + msg.content + " by " + msg.author.name + " (" + msg.author.id + ") @ " + msg.channel.server.name + " in " + msg.channel.name 
print(str(log.encode("utf8"))) 

если ваш интересно, что/где тзд материал поступает из своей программы/chat thing, im, получая информацию о отправленном сообщении, содержимое и т. д., но по какой-то причине я не могу перевести эти байты на строки/буквы и т. д.

+0

Пожалуйста, используйте фактический текст в своем вопросе, а не скриншоты текста. Вы можете отредактировать свой вопрос, чтобы удалить скриншоты и заменить их на фактический текст. – marcelm

+0

исправил это, извините. – ImUniverseSE

+0

Не пытайтесь кодировать строку, просто распечатайте ее напрямую. 'print' в Python 3 должен делать кодировку автоматически. Если это не так, это другая проблема. –

ответ

0

Я немного поиграл с вашим примером и нашел что-то сладкий ..

Во-первых: не используйте str() для преобразования байт, то результат не то, что вы могли бы ожидать:

>>> str(b'abcd') 
"b'abcd'" 

Python просто ставит строковое представление входных байтов в какой-либо другой строки ,

Преобразовать так:

>>> b'abcd'.decode('utf-8') 
'abcd' 

Я написал несколько простой класс для имитации вашего msg:

class Obj: 
    def __init__(self, **kwargs): 
     [setattr(self, k, v) for k, v in kwargs.items()] 

msg = Obj(
    content='some text', 
    author=Obj(
     id='1337', name='some author' 
    ), 
    channel=Obj(
     server=Obj(name='localhost'), 
     name='#some_channel', 
    ), 
) 

Второе: Создать логарифмическая функция которым принимает msg объект и выводит информацию :

def log_msg(msg): 
    content = msg.content 
    return '''Message: \ 
{content} \ 
by {author_name} ({author_id}) \ 
@ {server_name} \ 
in {channel_name}'''.format(
     content=content, 
     author_name=msg.author.name, 
     author_id=msg.author.id, 
     server_name=msg.channel.server.name, 
     channel_name=msg.channel.name, 
    ) 

Для построения выходной строки используется многострочная строка ''' ... ''' и str.format().

Теперь я могу сделать:

print(log_msg(msg)) 
>>> Message: some text by some author (1337) @ localhost in #some_channel 

Теперь, если я использую данные примеры, что-то происходит:

msg.content = '\xe2\x9d\xa4' 

print(log_msg(msg)) 
>>> Message: ⤠by some author (1337) @ localhost in #some_channel 

Выглядит странно, но если вы посмотрите на кодовые где-то, все выглядит нормально:

\xe2; \x9d; \xa4


Но это не так, как мы имеем дело с байтами там:

msg.content = b'\xe2\x9d\xa4' 
print(log_msg(msg)) 
>>> Message: b'\xe2\x9d\xa4' by some author (1337) @ localhost in #some_channel 

Это тоже неправильно, мы получаем строковое представление входных байтов здесь.

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

def log_msg(msg): 
    content = msg.content 
    if not isinstance(content, str): 
     content = content.decode('utf-8') 
    return '''Message: \ 
       ... 

И посмотреть:

msg.content = b'\xe2\x9d\xa4' 
print(log_msg(msg)) 
>>> Message: ❤ by some author (1337) @ localhost in #some_channel 

Таким образом, не следует путать с типами данных (байт, ул) и не путайте порядок конвертации ... ❤