[問題] read輸入中文字(全形字),刪除只能刪一半

看板Linux作者 (dave)時間2年前 (2022/05/23 15:15), 編輯推噓4(4067)
留言71則, 7人參與, 2年前最新討論串1/1
此問題困擾已久。例如: read var <Enter> 此時輸入中文,例如「加由」,欲修改為「油」時,按backspace鍵, 螢幕卻顯示「由」只刪除一半。請問此問題如何解決? 在bash、zsh下都是如此。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.175.107.43 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1653290140.A.CDF.html

05/23 18:48, 2年前 , 1F
哪種 linux 系統版本? 本機還是遠端操作環境?有無在 x
05/23 18:48, 1F

05/23 18:48, 2年前 , 2F
window 內?
05/23 18:48, 2F

05/23 21:00, 2年前 , 3F
Fedora和pop都測試過了,都是如此,是在本機的x windo
05/23 21:00, 3F

05/23 22:42, 2年前 , 4F
我用fedora很正常啊?
05/23 22:42, 4F

05/23 22:44, 2年前 , 5F
測了一下ubuntu 20.04 bash也有這現象,應該是backspace刪
05/23 22:44, 5F

05/23 22:45, 2年前 , 6F
掉1個中文字但游標卻只回移1個半形英數寬度,按backspace
05/23 22:45, 6F

05/23 22:46, 2年前 , 7F
2次[加由]兩字應該已經刪除,但螢幕卻還留了一個字,再按bs
05/23 22:46, 7F

05/23 22:46, 2年前 , 8F
游標也不會再回移
05/23 22:46, 8F

05/24 01:35, 2年前 , 9F
換 terminal 呢? 例如 kitty 或 alacritty
05/24 01:35, 9F

05/24 06:35, 2年前 , 10F
測試過tilix gnome-terminal ,也安裝alacritty測試
05/24 06:35, 10F

05/24 06:37, 2年前 , 11F
,問題一樣。改字體也是。回去用Fedora確認,也是如此
05/24 06:37, 11F

05/24 06:54, 2年前 , 12F
bash, zsh都有這問題,fish正常,導致script中必須呼
05/24 06:54, 12F

05/24 06:55, 2年前 , 13F
叫fish來read中文輸入。蠻困擾的,另外,在terminal下
05/24 06:55, 13F

05/24 06:55, 2年前 , 14F
,python的input()有同樣問題
05/24 06:55, 14F

05/24 07:01, 2年前 , 15F
python input()有此問題,是指在terminal執行python
05/24 07:01, 15F

05/24 07:01, 2年前 , 16F
script,不是python shell
05/24 07:01, 16F

05/24 07:26, 2年前 , 17F
用 bash 的話可以加 -e 讓它用 Readline 函式庫處理輸入
05/24 07:26, 17F

05/24 07:33, 2年前 , 18F
在沒有輸入函式庫輔助的環境下,按一次 backspace 就是退
05/24 07:33, 18F

05/24 07:34, 2年前 , 19F
1 格和刪除 1 byte 的資料,但你的「由」分別佔了 2 格和
05/24 07:34, 19F

05/24 07:36, 2年前 , 20F
3 byte 的空間,所以螢幕顯示會和實際送進程式的內容不同
05/24 07:36, 20F

05/24 07:37, 2年前 , 21F
實際上你應該要按 3 次 backspace,把畫面上的「加」也吃
05/24 07:37, 21F

05/24 07:38, 2年前 , 22F
掉一半,再輸入「油」,程式看到的才會是「加油」。
05/24 07:38, 22F

05/24 11:11, 2年前 , 23F
測試read e var,以及read -e var,呈現的情形相同。
05/24 11:11, 23F

05/24 11:24, 2年前 , 24F
使用真正 multilingual 的 mlterm。
05/24 11:24, 24F

05/24 11:24, 2年前 , 25F

05/24 11:26, 2年前 , 26F
05/24 11:26, 26F

05/24 13:09, 2年前 , 27F
安裝mlterm,使用您的設定檔,情形大致如同先前。
05/24 13:09, 27F

05/24 21:10, 2年前 , 28F
如果 read -e 沒效,那可能要檢查你使用的 locale 是不是
05/24 21:10, 28F

05/24 21:12, 2年前 , 29F
用 UTF-8 編碼了。照理說你的環境應該要是 UTF-8,不然連
05/24 21:12, 29F

05/24 21:12, 2年前 , 30F
gnome-terminal 都開不起來。
05/24 21:12, 30F

05/24 21:18, 2年前 , 31F
先說 read -e 只在 bash 有用,我不知道 zsh 要怎麼用。
05/24 21:18, 31F

05/24 22:03, 2年前 , 32F
非常感謝,確實我用的是zsh,bash下read -e完美解決
05/24 22:03, 32F

05/24 22:05, 2年前 , 33F
我平常用zsh,但是script是用bash寫的,所以此法適用
05/24 22:05, 33F

05/24 22:49, 2年前 , 34F
這個問題很困擾的原因,除了read以外,C++的cin也有同
05/24 22:49, 34F

05/24 22:50, 2年前 , 35F
同樣情形,python input()在bash下執行也是
05/24 22:50, 35F

05/24 23:26, 2年前 , 36F
因為系統預設的輸入界面就是那個樣子,kernel 並沒有內建
05/24 23:26, 36F

05/24 23:28, 2年前 , 37F
Unicode 資料庫,無法處理現今複雜的文字和編碼系統。因
05/24 23:28, 37F

05/24 23:29, 2年前 , 38F
此如果需要提供使用者比較好的輸入界面,就要靠外部函式
05/24 23:29, 38F

05/24 23:29, 2年前 , 39F
庫,像是 bash 和 python 的互動式界面都是用 readline。
05/24 23:29, 39F

05/24 23:35, 2年前 , 40F
好像不應該說沒有內建 Unicode 資料庫,應該是說不是拿來
05/24 23:35, 40F

05/24 23:36, 2年前 , 41F
用在這個地方,畢竟處理大小寫還是會用到 Unicode 資料。
05/24 23:36, 41F

05/24 23:37, 2年前 , 42F
總之如果是你自己的程式要提供好用的介面,那你的程式本
05/24 23:37, 42F

05/24 23:40, 2年前 , 43F
身應該要去呼叫外部函式庫,同時也要注意授權。如果是別
05/24 23:40, 43F

05/24 23:41, 2年前 , 44F
人的程式沒用相關函式庫造成很難操作,可以試試 rlwrap。
05/24 23:41, 44F

05/25 09:34, 2年前 , 45F
謝謝,原來如此。也謝謝以上大家協助測試。
05/25 09:34, 45F

05/25 12:44, 2年前 , 46F
這個問題曾有人提出過,也是用 Fedora 的,是用
05/25 12:44, 46F

05/25 12:45, 2年前 , 47F
read -e 解決。比較奇怪的是,我在 FreeBSD 測試過多
05/25 12:45, 47F

05/25 12:45, 2年前 , 48F
種 terminal,不會有這個問題。顯然可能和較底層的
05/25 12:45, 48F

05/25 12:46, 2年前 , 49F
lib 甚至 kernel 有關。
05/25 12:46, 49F

05/25 13:34, 2年前 , 50F
BTW,我所謂不會有問題是指中文感長度不會誤判,但一
05/25 13:34, 50F

05/25 13:35, 2年前 , 51F
個中文字還是要 bs 二次才會刪除。
05/25 13:35, 51F

05/25 13:35, 2年前 , 52F
s/感長度/總長度/g
05/25 13:35, 52F

05/25 16:09, 2年前 , 53F
zsh 可以用 vared 就好, ex: vared -c varname
05/25 16:09, 53F

05/25 16:10, 2年前 , 54F
varname 若是已經存在會帶入,要空值就先 unset 一次
05/25 16:10, 54F

05/26 01:17, 2年前 , 55F
FreeBSD 我用起來跟 Linux 行為一樣耶,都是幾個 byte 就
05/26 01:17, 55F

05/26 01:19, 2年前 , 56F
要按幾次 backspace。如果你是用 Big5 一個字 2 byte 那
05/26 01:19, 56F

05/26 01:19, 2年前 , 57F
還能跟螢幕寬度對起來,用 UTF-8 一個字 3 ~ 4 byte 就對
05/26 01:19, 57F

05/26 01:19, 2年前 , 58F
不起來了。
05/26 01:19, 58F

05/26 09:48, 2年前 , 59F
你說的那個是程式意義上所佔的空間,並不是螢幕上呈
05/26 09:48, 59F

05/26 09:49, 2年前 , 60F
現的幾何度量。不管什麼編碼,在螢幕呈現上,
05/26 09:49, 60F

05/26 09:50, 2年前 , 61F
terminal 固定字型,以英文字是一個單位的話,那麼中
05/26 09:50, 61F

05/26 09:50, 2年前 , 62F
文字就是二個單位。
05/26 09:50, 62F

05/26 09:51, 2年前 , 63F
在 X/terminal/bash 互動下執行 read var 按 Enetr,
05/26 09:51, 63F

05/26 09:51, 2年前 , 64F
然後輸入三個中文字,FreeBSD 會被解讀成六個英文字
05/26 09:51, 64F

05/26 09:52, 2年前 , 65F
(雖顯示是正確)可以 bs 六次刪除。但在 Linux 大多
05/26 09:52, 65F

05/26 09:53, 2年前 , 66F
數的 terminal 會被解讀成三個英文字,bs 往後刪的時
05/26 09:53, 66F

05/26 09:56, 2年前 , 67F
候,刪到一個半中文字就停了,無法再向後刪。
05/26 09:56, 67F

05/26 09:57, 2年前 , 68F
我覺得這是 i18n 化時的漏洞。才會出現半個中文字。
05/26 09:57, 68F

05/26 09:58, 2年前 , 69F
我會建議 mlterm 是它也會解讀成六個英文字,可以正
05/26 09:58, 69F

05/26 09:59, 2年前 , 70F
確 bs 六次刪除。也就是說雖沒認出是中文字,但勉強
05/26 09:59, 70F

05/26 10:00, 2年前 , 71F
可用。
05/26 10:00, 71F
文章代碼(AID): #1YYpISpV (Linux)
文章代碼(AID): #1YYpISpV (Linux)