我用 Rust 编写了一个 echo 程序(可以处理 UTF-8),有时 st 似乎会弄乱 UTF-8 输入。我尝试了不同的终端仿真器,比如 alacritty 和 gnome-terminal,它们运行良好。
要重现这一点:
- 在 st 中运行这个 Rust 代码:
use std::io::BufRead;
fn main() {
for line in std::io::stdin().lock().lines() {
let line = line.unwrap();
println!("{line}");
}
}
- 输入诸如“Rückgängig”之类的内容,或其他带有非英文字符的字符串。
一段时间后,程序应该会失败:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { kind: InvalidData, message: "stream did not contain valid UTF-8" }', src/main.rs:5:25
有谁知道如何解决这个问题或为什么会发生这种情况?
您Backspace在输入这些单词时可能会按吗?
执行
cat
,键入带有重音字母的内容,按Backspace几次(至少跨越一个重音字母),然后按Enter。你得到同样的回声了吗?我不。看起来
st
没有设置IUTF8
标志。虽然它会擦除屏幕上的整个字母,但只有 UTF-8 序列的最后一个字节会从内核的熟模式 tty 缓冲区中擦除。该命令
stty iutf8
应该可以解决这个问题,但如果编码是 UTF-8,则正确的位置是进行st
相应的tcsetattr(<IUTF8>)
调用,因为其他终端仿真器会这样做。