Python str.translate Unicode

Итак, я создаю кейлоггер на Python. Мне удалось получить статус ключа модификаторов Differentnet при нажатии клавиши, поэтому я разработал функцию, например, чтобы поместить букву в заглавные буквы при нажатии Shift, и вот она:

def applyKeyModifier(x,shift,ctrl,altgr,win):
    keyboard      = u"""²&é"'(-è_çà)=azertyuiop^$qsdfghjklmù*<wxcvbn,;:!/*-+"""
    shiftModified = u"""_1234567890°+AZERTYUIOP¨£QSDFGHJKLM%µ>WXCVBN?./§/*-+"""
    altgrModified = u"""__~#{[|`\^@]}€__________¤___________________________"""

    shiftTranslation = string.maketrans(keyboard, shiftModified)
    altgrTranslation = string.maketrans(keyboard, altgrModified)
    if shift and not altgr and not ctrl and not win:
        translated = x.translate(shiftTranslation)
        if translated == "_":
            translated = ""
        return translated
    elif altgr and not shift and not ctrl and not win:
        translated = x.translate(shiftTranslation)
        if translated == "_":
            translated = ""
        return translated
    elif ctrl and not shift and not altgr and not win: 
        return " [CTRL+"+x+"] "
    elif win and not shift and not altgr and not ctrl: 
        return " [WIN/CMD+"+x+"] "
    else:
        return x

Единственная проблема в том, что я получаю такую ​​ошибку:

C:\Users\tugle\Desktop>python keylogger.py
Traceback (most recent call last):
  File "keylogger.py", line 139, in <module>
    listener.join()
  File "C:\dev\Python27\lib\site-packages\pynput\_util\__init__.py", line 199, in join
    six.reraise(exc_type, exc_value, exc_traceback)
  File "C:\dev\Python27\lib\site-packages\pynput\_util\__init__.py", line 154, in inner
    return f(self, *args, **kwargs)
  File "C:\dev\Python27\lib\site-packages\pynput\keyboard\_win32.py", line 237, in _process
    self.on_press(key)
  File "C:\dev\Python27\lib\site-packages\pynput\_util\__init__.py", line 75, in inner
    if f(*args) is False:
  File "keylogger.py", line 117, in on_press
    keybuffer += applyKeyModifier(str(key),isShift,isCtrl,isAltGr,isWin)
  File "keylogger.py", line 19, in applyKeyModifier
    shiftTranslation = string.maketrans(keyboard, shiftModified)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb2' in position 0: ordinal not in range(128)

Я использую python2. Так может кто-нибудь помочь мне здесь

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
361
1

Ответы 1

Метод translate() ведет себя по-разному в зависимости от того, вызывается он на str или unicode. Вы работаете с символами, отличными от ASCII, поэтому ваши строки должны быть объектами unicode, а unicode.translate() принимает отображение (dict) вместо таблицы maketrans. Процитировали документы:

For Unicode objects, the translate() method does not accept the optional deletechars argument. Instead, it returns a copy of the s where all characters have been mapped through the given translation table which must be a mapping of Unicode ordinals to Unicode ordinals, Unicode strings or None. Unmapped characters are left untouched. Characters mapped to None are deleted.

Таким образом, shiftTranslation должен иметь вид:

shiftTranslation = {
    ord(u'²'): u'_',
    ord(u'&'): u'1',
    ord(u'é'): u'2',
    # etc.
}

Теперь у меня есть: TypeError: ожидается строка или другой объект символьного буфера

TheStaticTurtle 02.09.2018 22:47

Другие вопросы по теме