Php 终端中的退格和UTF8编码
下面是一个简单的PHP测试脚本: 下一次启动时,我键入“ППцццц”,然后按backspace,然后再次按“τ”: 当我按下backspace键时,似乎只删除了输入序列中的一个字节,而所有字符的长度都是两个字节Php 终端中的退格和UTF8编码,php,utf-8,terminal,Php,Utf 8,Terminal,下面是一个简单的PHP测试脚本: 下一次启动时,我键入“ППцццц”,然后按backspace,然后再次按“τ”: 当我按下backspace键时,似乎只删除了输入序列中的一个字节,而所有字符的长度都是两个字节 是否有一种方法可以从输入中获取字符串,以便用户可以在键入时更正它?答案是检查您的配置中是否支持扩展名stty,以及该扩展名是否在您看到问题时生效 传统上,终端驱动程序在收到擦除字符时从输入中删除一个字节。然而,UTF-8是一种多字节编码(每个字符有多个字节),通过这种方式可以更好地满
是否有一种方法可以从输入中获取字符串,以便用户可以在键入时更正它?答案是检查您的配置中是否支持扩展名
stty
,以及该扩展名是否在您看到问题时生效
传统上,终端驱动程序在收到擦除字符时从输入中删除一个字节。然而,UTF-8是一种多字节编码(每个字符有多个字节),通过这种方式可以更好地满足用户的期望
- 删除最后一个输入字符的所有字节(由终端驱动程序)和
- 向左移动光标(通过终端仿真器)
stty
扩展最初是作为Linux内核补丁添加的(请参阅讨论),并且似乎在其他一些系统(例如OSX)中得到了支持。此stty
命令在OSX 10.9上的xterm
中运行,并在iflags
部分将iutf8
显示为一个选项:
bash-3.2$ stty -a
speed 38400 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff -ixany -imaxbel iutf8
-ignbrk -brkint -inpck -ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>; eol2 = ^@;
erase = ^H; intr = ^C; kill = ^U; lnext = ^V; min = 1; quit = ^\;
reprint = ^R; start = ^Q; status = ^T; stop = ^S; susp = ^Z;
time = 0; werase = ^W;
bash-3.2$stty-a
速度38400波特;24排;80列;
lflags:icanon isig iexten echo echok echoke-echonl echoctl
-echoprt-altwerase-noflsh-tostop-flusho pendin-Nokerinfo
-extproc
iflags:-istrip icrnl-inlcr-igncr ixon-ixoff-ixany-imaxbel iutf8
-ignbrk-brkint-inpck-ignpar-parmrk
oflags:opost onlcr oxtabs onlcr onlret
cflags:cread cs8 parenb-parodd hupcl-clocal-cstopb-crtscts-dsrflow
-dtrflow-mdmbuf
cchars:丢弃=^O;dsusp=^Y;eof=^D;eol=;eol2=^@;
擦除=^H;intr=^C;杀死你;lnext=^V;最小值=1;退出=^\;
重印=^R;开始=^Q;状态=^T;停止=^S;susp=^Z;
时间=0;werase=^W;
erase
设置当然是“backspace”键。您尝试过标准html输入吗?@RohitGupta我需要在控制台php脚本中获取字符串。Html输入用于网页。或者你是什么意思?我很困惑,你是想用php编写一个桌面应用程序吗?你是对的,这是我的终端应用程序的问题。它出现在Gnome终端中,而在XTerm中一切正常。在两个端子中,擦除字符为^?我试图设置^H(就像在您的设置中一样),但它不起作用。你知道如何修复我的Gnome终端吗?(我使用Ubuntu14.04)不是随便的——我偶尔会看到该功能的错误报告。如果其他人也遇到过这种情况,我也会遇到同样的问题,因为我运行的二进制文件从开发docker容器中读取输入。修复方法是直接从Ubuntu的终端运行二进制文件。注意:有趣的是,当我从docker容器运行stty-a
时,我报告了iutf8
标志。
gkuzovnikov@gkdevel:~$ php ~/test.php
> Привет
Привет d09fd180d0b8d0b2d0b5d182
gkuzovnikov@gkdevel:~$ php ~/test.php
> Привет
Приве�т d09fd180d0b8d0b2d0b5d1d182
bash-3.2$ stty -a
speed 38400 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff -ixany -imaxbel iutf8
-ignbrk -brkint -inpck -ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>; eol2 = ^@;
erase = ^H; intr = ^C; kill = ^U; lnext = ^V; min = 1; quit = ^\;
reprint = ^R; start = ^Q; status = ^T; stop = ^S; susp = ^Z;
time = 0; werase = ^W;