为什么退格键和Ctrl +退格键在Linux和Windows中产生不同的字节串,如何在代码中解决这种差异?

k5hmc34c  于 9个月前  发布在  Linux
关注(0)|答案(1)|浏览(148)

我正在用Python编写一个打字游戏,它使用getch()来读入字符,然后根据输入的字符执行不同的操作。
阅读字符并将其分配给字节串(如果需要)的代码如下:

character = getch() # Imported via pip install py-getch
# character is returned as a bytestring on 
# Windows but a string in Linux, so I added in 
# the following if statement to resolve this 
# difference.
if type(character) == str:
    character = character.encode()

字符串
在Windows终端中,如果我输入退格键,character的值将变为b'\x08'。同时,如果我按Ctrl +退格键,b'\x7f'将存储在“character”中。
然而,我发现,在我的Ubuntu终端中,这些字节串是相反的:一个常规的退格键(在它被编码后)返回b'\x7f',而Ctrl +退格键返回b'\x08'。这意味着,在不调整播放器的操作系统的情况下,按退格键将导致我的程序在Windows中删除一个字符,但在Linux中删除整个单词。
这是否反映了这两个操作系统上的正常行为,或者可能是我的设置或代码中有什么不寻常的地方导致了这种差异?
我目前正在通过检查玩家的平台来解决这个问题,然后使用这些信息来确定哪些字节串Map到'character_backspace'和'word_backspace'。如果玩家输入的字符与这些变量之一匹配,我可以让脚本分别删除单个字符或整个单词。
下面是我使用的代码:

import platform
if platform.system() == 'Linux':
    character_backspace = b'\x7f'
    word_backspace = b'\x08'
else:
    character_backspace = b'\x08'
    word_backspace = b'\x7f'

  • (我还没有在Mac上测试过这种行为,所以我可能需要根据Backspace和Command + Backspace在该系统上产生的字节串来更新代码。

这种方法可以满足我的需要,但是有没有更优雅的解决方案可以避免代码首先检查播放器的平台?

ua4mk5z4

ua4mk5z41#

在Linux上,以下事实 * 默认为真 *:

  • PC键盘的退格键 * 生成ASCII DEL字符(其他键盘型号的行为可能不同)
  • ASCII DEL字符,在编辑时键入时,将删除最后一个字符
  • Ctrl+W,当编辑时输入时,删除最后一个单词
  • Ctrl-H a.k.a. ASCII BS * 字符 * 不执行任何编辑功能

所有这些都是在内核级别完成的,与Python无关。Python只是将操作系统发送给它的东西发送给你。注意,包含自己的编辑功能的程序(如bash或Vim)可能会为这些字符分配不同的编辑功能。
这些默认值可以全局更改,但这样的更改可能会改变其他程序的行为。
我建议在你的程序中添加一个可配置的键盘Map,这样,用户就可以配置他们想要的,即使他们有奇怪的默认值或非标准键盘。

相关问题