Linux 板


LINE

此问题困扰已久。例如: read var <Enter> 此时输入中文,例如「加由」,欲修改为「油」时,按backspace键, 萤幕却显示「由」只删除一半。请问此问题如何解决? 在bash、zsh下都是如此。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.175.107.43 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1653290140.A.CDF.html
1F:→ kenduest: 哪种 linux 系统版本? 本机还是远端操作环境?有无在 x 05/23 18:48
2F:→ kenduest: window 内? 05/23 18:48
3F:→ franzhuang: Fedora和pop都测试过了,都是如此,是在本机的x windo 05/23 21:00
4F:→ OrzOGC: 我用fedora很正常啊? 05/23 22:42
5F:→ bitlife: 测了一下ubuntu 20.04 bash也有这现象,应该是backspace删 05/23 22:44
6F:→ bitlife: 掉1个中文字但游标却只回移1个半形英数宽度,按backspace 05/23 22:45
7F:→ bitlife: 2次[加由]两字应该已经删除,但萤幕却还留了一个字,再按bs 05/23 22:46
8F:→ bitlife: 游标也不会再回移 05/23 22:46
9F:推 asas1asas200: 换 terminal 呢? 例如 kitty 或 alacritty 05/24 01:35
10F:→ franzhuang: 测试过tilix gnome-terminal ,也安装alacritty测试 05/24 06:35
11F:→ franzhuang: ,问题一样。改字体也是。回去用Fedora确认,也是如此 05/24 06:37
12F:→ franzhuang: bash, zsh都有这问题,fish正常,导致script中必须呼 05/24 06:54
13F:→ franzhuang: 叫fish来read中文输入。蛮困扰的,另外,在terminal下 05/24 06:55
14F:→ franzhuang: ,python的input()有同样问题 05/24 06:55
15F:→ franzhuang: python input()有此问题,是指在terminal执行python 05/24 07:01
16F:→ franzhuang: script,不是python shell 05/24 07:01
17F:推 lantw44: 用 bash 的话可以加 -e 让它用 Readline 函式库处理输入 05/24 07:26
18F:→ lantw44: 在没有输入函式库辅助的环境下,按一次 backspace 就是退 05/24 07:33
19F:→ lantw44: 1 格和删除 1 byte 的资料,但你的「由」分别占了 2 格和 05/24 07:34
20F:→ lantw44: 3 byte 的空间,所以萤幕显示会和实际送进程式的内容不同 05/24 07:36
21F:→ lantw44: 实际上你应该要按 3 次 backspace,把画面上的「加」也吃 05/24 07:37
22F:→ lantw44: 掉一半,再输入「油」,程式看到的才会是「加油」。 05/24 07:38
23F:→ franzhuang: 测试read e var,以及read -e var,呈现的情形相同。 05/24 11:11
24F:→ EdwardGJLee: 使用真正 multilingual 的 mlterm。 05/24 11:24
25F:→ EdwardGJLee: http://mlterm.sourceforge.net/ 05/24 11:24
26F:→ EdwardGJLee: https://tinyurl.com/4jn457dj 参考设定档 05/24 11:26
27F:→ franzhuang: 安装mlterm,使用您的设定档,情形大致如同先前。 05/24 13:09
28F:→ lantw44: 如果 read -e 没效,那可能要检查你使用的 locale 是不是 05/24 21:10
29F:→ lantw44: 用 UTF-8 编码了。照理说你的环境应该要是 UTF-8,不然连 05/24 21:12
30F:→ lantw44: gnome-terminal 都开不起来。 05/24 21:12
31F:→ lantw44: 先说 read -e 只在 bash 有用,我不知道 zsh 要怎麽用。 05/24 21:18
32F:→ franzhuang: 非常感谢,确实我用的是zsh,bash下read -e完美解决 05/24 22:03
33F:→ franzhuang: 我平常用zsh,但是script是用bash写的,所以此法适用 05/24 22:05
34F:→ franzhuang: 这个问题很困扰的原因,除了read以外,C++的cin也有同 05/24 22:49
35F:→ franzhuang: 同样情形,python input()在bash下执行也是 05/24 22:50
36F:推 lantw44: 因为系统预设的输入界面就是那个样子,kernel 并没有内建 05/24 23:26
37F:→ lantw44: Unicode 资料库,无法处理现今复杂的文字和编码系统。因 05/24 23:28
38F:→ lantw44: 此如果需要提供使用者比较好的输入界面,就要靠外部函式 05/24 23:29
39F:→ lantw44: 库,像是 bash 和 python 的互动式界面都是用 readline。 05/24 23:29
40F:→ lantw44: 好像不应该说没有内建 Unicode 资料库,应该是说不是拿来 05/24 23:35
41F:→ lantw44: 用在这个地方,毕竟处理大小写还是会用到 Unicode 资料。 05/24 23:36
42F:→ lantw44: 总之如果是你自己的程式要提供好用的介面,那你的程式本 05/24 23:37
43F:→ lantw44: 身应该要去呼叫外部函式库,同时也要注意授权。如果是别 05/24 23:40
44F:→ lantw44: 人的程式没用相关函式库造成很难操作,可以试试 rlwrap。 05/24 23:41
45F:→ franzhuang: 谢谢,原来如此。也谢谢以上大家协助测试。 05/25 09:34
46F:→ EdwardGJLee: 这个问题曾有人提出过,也是用 Fedora 的,是用 05/25 12:44
47F:→ EdwardGJLee: read -e 解决。比较奇怪的是,我在 FreeBSD 测试过多 05/25 12:45
48F:→ EdwardGJLee: 种 terminal,不会有这个问题。显然可能和较底层的 05/25 12:45
49F:→ EdwardGJLee: lib 甚至 kernel 有关。 05/25 12:46
50F:→ EdwardGJLee: BTW,我所谓不会有问题是指中文感长度不会误判,但一 05/25 13:34
51F:→ EdwardGJLee: 个中文字还是要 bs 二次才会删除。 05/25 13:35
52F:→ EdwardGJLee: s/感长度/总长度/g 05/25 13:35
53F:推 kenduest: zsh 可以用 vared 就好, ex: vared -c varname 05/25 16:09
54F:→ kenduest: varname 若是已经存在会带入,要空值就先 unset 一次 05/25 16:10
55F:→ lantw44: FreeBSD 我用起来跟 Linux 行为一样耶,都是几个 byte 就 05/26 01:17
56F:→ lantw44: 要按几次 backspace。如果你是用 Big5 一个字 2 byte 那 05/26 01:19
57F:→ lantw44: 还能跟萤幕宽度对起来,用 UTF-8 一个字 3 ~ 4 byte 就对 05/26 01:19
58F:→ lantw44: 不起来了。 05/26 01:19
59F:→ EdwardGJLee: 你说的那个是程式意义上所占的空间,并不是萤幕上呈 05/26 09:48
60F:→ EdwardGJLee: 现的几何度量。不管什麽编码,在萤幕呈现上, 05/26 09:49
61F:→ EdwardGJLee: terminal 固定字型,以英文字是一个单位的话,那麽中 05/26 09:50
62F:→ EdwardGJLee: 文字就是二个单位。 05/26 09:50
63F:→ EdwardGJLee: 在 X/terminal/bash 互动下执行 read var 按 Enetr, 05/26 09:51
64F:→ EdwardGJLee: 然後输入三个中文字,FreeBSD 会被解读成六个英文字 05/26 09:51
65F:→ EdwardGJLee: (虽显示是正确)可以 bs 六次删除。但在 Linux 大多 05/26 09:52
66F:→ EdwardGJLee: 数的 terminal 会被解读成三个英文字,bs 往後删的时 05/26 09:53
67F:→ EdwardGJLee: 候,删到一个半中文字就停了,无法再向後删。 05/26 09:56
68F:→ EdwardGJLee: 我觉得这是 i18n 化时的漏洞。才会出现半个中文字。 05/26 09:57
69F:→ EdwardGJLee: 我会建议 mlterm 是它也会解读成六个英文字,可以正 05/26 09:58
70F:→ EdwardGJLee: 确 bs 六次删除。也就是说虽没认出是中文字,但勉强 05/26 09:59
71F:→ EdwardGJLee: 可用。 05/26 10:00
72F:推 lantw44: 刚才实际测试,在 Linux 下如同你说的按三次 backspace 05/29 23:22
73F:→ lantw44: 就全部删完了,只是游标位置不对,停在一个半的地方。 05/29 23:22
74F:→ lantw44: 在 FreeBSD 下则是按九次 backspace 才成功让 read 读到 05/29 23:23
75F:→ lantw44: 空字串,但游标在按六次的时候就已经回到行首了,所以依 05/29 23:24
76F:→ lantw44: 然有游标位置错误的问题。在 FreeBSD 下如果只按六次,虽 05/29 23:24
77F:→ lantw44: 然可以让画面中的字全部消失,但 read 还是会读到一个字 05/29 23:25
78F:→ EdwardGJLee: 你说的对,之前我偷懒没去验证 var 的值,造成误判。 05/30 14:41
79F:→ EdwardGJLee: 看来还是交给 readline 处理最保险。 05/30 14:42







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP