如何修复 Qt 自定义终端提示乱码问题

如何修复 Qt 自定义终端提示乱码问题

我通过绑定 bash 制作了一个终端质量过程:

// c++ in Qt4.8.7 on CentOS7
process_ptr->start("bash -i", QIODevice::ReadWrite | QIODevice::Append);
// With the "-i" option, interactive bash is able to display the *prompt*

命令通过输入QC命令行,喂给质量过程,输出被打印到Q纯文本编辑

我已将标准输出通道与标准错误通道合并:

process_ptr->setProcessChannelMode(QProcess::MergedChannels);

问题是:命令提示符(由PS1设置)在Q纯文本编辑,用于显示 stdout 或 stderr,很混乱。

具体来说,打印的内容Q纯文本编辑如下:

^[]0;eng@hostname:~^G[eng@hostname 15:36:41 #17 ~]$
ls

Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
^[]0;eng@hostname:~^G[eng@hostname 16:05:12 #18 ~]$
echo $PS1
[\u@\H \t #\# \W]\$
^[]0;eng@hostname:~^G[eng@hostname 16:05:35 #19 ~]$

^[]0;eng@hostname:~^G[eng@hostname 16:05:36 #19 ~]$

我已将 PS1 设置为

PS1="[\u@\H \t #\# \W]\$ "

看起来命令提示符的后半部分[eng@hostname 15:36:41 #17 ~]$是我通过 PS1 正确设置的。

现在我不知道如何摆脱前半部分 ^[]0;eng@hostname:~^G,其中^[表示 ASCII 控制字符“ESC”,^G表示 ASCII 控制字符“BEL”

我研究过这个概念终端对于这个问题:我通过绑定固定bash的做法质量过程绕过线路规则和 pty,换句话说,输入和输出内容是写/读直接进入 bash 进程,无需经过线路规则和 pty(这是链接,它可能有用:终端/终端

目前我不确定应该查看哪个模块来定位问题的根本原因:标准输出/错误通道重定向、bash 的基本原理、Q纯文本编辑在Qt等中

非常感谢您提出的宝贵意见或解决方案!

答案1

.profile您的(或.bash_profile- 甚至错误地)中可能有某些内容.bashrc修改了您的PS1.例如,在我的系统上,bash -ix -c true 2>&1 | grep PS1= | cat -v显示这些:

+ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
++ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+ PS1='\[^[[1m^[[32m\]\u@\h\[^[[39;49m\]:\[^[[34m\]\w\[^[(B^[[m\]\$ '
+ PS1='\[\033]0;\u@\h: \w\007\]\[^[[1m^[[32m\]\u@\h\[^[[39;49m\]:\[^[[34m\]\w\[^[(B^[[m\]\$ '

一个可能的根本原因是您TERM从执行 Qt 程序的 shell 中设置了环境。行为良好的启动脚本将使用tput或 类似的方法来查找正确的转义序列,因此导出TERM=dumb到 shell 进程应该给出简单的提示。我们可以使用以下方法演示TERM=dumb bash -ix -c true 2>&1 | grep PS1= | cat -v

+ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
++ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+ PS1='\[\]\u@\h\[\]:\[\]\w\[\]\$ '

如果我没记错的话,^[]0;……^G序列是xterm设置窗口标题的控制代码。

相关内容