![Suckless 的 st 有时会搞乱 UTF-8](https://linux22.com/image/202751/Suckless%20%E7%9A%84%20st%20%E6%9C%89%E6%97%B6%E4%BC%9A%E6%90%9E%E4%B9%B1%20UTF-8.png)
我用 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
有谁知道如何解决此问题或为什么会发生这种情况?
答案1
您Backspace在输入这些单词时可能会按下按键吗?
执行cat
,键入带有重音字母的内容,按Backspace几次(至少跨过一个重音字母),然后按Enter。你得到同样的回应吗?我不。
看起来st
没有设置IUTF8
标志。虽然它会删除屏幕上的整个字母,但只有 UTF-8 序列的最后一个字节会从内核的熟模式 tty 缓冲区中删除。
该命令应该可以解决这个问题,但如果编码是 UTF-8,stty iutf8
正确的位置应该是st
执行相应的调用,就像其他终端模拟器所做的那样。tcsetattr(<IUTF8>)