【发布时间】:2019-06-27 20:51:02
【问题描述】:
我正在使用here 中描述的光标移动功能为 Bash 编写游戏引擎。但是,如果我回显超过 1 个字节的表情符号或其他 UTF-8 字符,光标位置似乎会变得混乱。
例如,下面的代码应该回显“1????3”,将光标向后移动3个位置,然后在同一个位置回显“abc”。结果应该只是“abc”(理想情况下)。相反,我看到“1abc”
~ $ echo -e "1????3\033[3Dabc"
1abc
类似的问题可以用回车来说明:
~ $ echo -e "1????3\rabc"
abc3
有什么好的方法可以解决这个问题吗?我在 macOS 上使用终端应用程序。有什么便携的方法吗?
注意:请注意,并非所有 UTF-8 字符似乎都以这种方式表现。大多数情况下,我只能用表情符号重现这个问题:
~ $ while true; do read -p "Enter emoji: " x; echo $x | hexdump; echo -e "1${x}3\033[3Dabc"; done
Enter emoji: ????
0000000 f0 9f 94 88 0a
0000005
1abc
Enter emoji: ♞
0000000 e2 99 9e 0a
0000004
abc
Enter emoji: ☞
0000000 e2 98 9e 0a
0000004
abc
Enter emoji: ????
0000000 f0 9f 98 8b 0a
0000005
1abc
Enter emoji: ????
0000000 f0 9f 83 98 0a
0000005
abc
Enter emoji: ????
0000000 f0 9f 80 96 0a
0000005
abc
Enter emoji: ????
0000000 f0 9d 95 ad 0a
0000005
abc
Enter emoji: ????????
0000000 f0 9f 87 ba f0 9f 87 b8 0a
0000009
1abc
Enter emoji: ✎
0000000 e2 9c 8e 0a
0000004
abc
【问题讨论】:
-
虽然我对您的问题没有现成的解决方案,但我可以给点小费吗?那就是查看ncurses库。它将允许您处理终端的任何部分。我想对于 macOS 这可能是一个起点:developer.apple.com/library/archive/documentation/System/…
-
另外,对于 ncurses,这可能会简要说明它可以做什么:rhardih.io/2010/04/…