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

问题描述 投票:0回答:1

我正在用 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 + Backspace,
b'\x7f'
就会存储在“字符”中。

但是,我发现,在我的 Ubuntu 终端中,这些字节串是相反的:常规退格键(编码后)返回

b'\x7f'
,而 Ctrl + Backspace 返回
b'\x08'
。这意味着,在不调整播放器操作系统的情况下,按退格键将导致我的程序在 Windows 中删除一个字符,但在 Linux 中删除整个单词。

这是否反映了这两个操作系统上的正常行为,或者我的设置或代码是否存在异常情况导致了这种差异?

我目前正在通过检查播放器的平台来解决此问题,然后使用该信息来确定将哪些字节串映射到“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 生成的字节串来更新代码。)

这种方法适合我的需求,但是有没有更优雅的解决方案可以防止代码首先检查玩家的平台?

python linux windows encoding getch
1个回答
0
投票

在 Linux 上,以下事实是正确的默认情况下

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

这一切都是在内核级别完成的,与Python无关。 Python 只是向您发送操作系统发送的任何内容。请注意,包含自己的编辑功能的程序(例如 bash 或 vim)可能会为这些字符分配不同的编辑功能。

这些默认值可以全局更改,但此类更改可能会改变其他程序的行为。

我建议在您的程序中添加可配置的键盘映射。这样,即使用户有奇怪的默认值或非标准键盘,用户也可以准确配置他们想要的内容。

© www.soinside.com 2019 - 2024. All rights reserved.