Python str.translate Unicode - PullRequest
       21

Python str.translate Unicode

0 голосов
/ 02 сентября 2018

Итак, я создаю кейлоггер Python. Мне удалось получить состояние клавиши модификаторов difnet при нажатии клавиши, и поэтому я разработал функцию, например, для ввода буквы в верхнем регистре при нажатии клавиши 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. Так может кто-нибудь помочь мне здесь

1 Ответ

0 голосов
/ 02 сентября 2018

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

Для объектов Unicode метод translate() не принимает необязательный аргумент deletechars . Вместо этого он возвращает копию s , где все символы были отображены через данную таблицу перевода, которая должна быть отображением ординалов Unicode в ординалы Unicode, строки Unicode или None. Несопоставленные символы остаются нетронутыми. Символы, сопоставленные с None, будут удалены.

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

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