Php 终端中的退格和UTF8编码

Php 终端中的退格和UTF8编码,php,utf-8,terminal,Php,Utf 8,Terminal,下面是一个简单的PHP测试脚本: 下一次启动时,我键入“ППцццц”,然后按backspace,然后再次按“τ”: 当我按下backspace键时,似乎只删除了输入序列中的一个字节,而所有字符的长度都是两个字节 是否有一种方法可以从输入中获取字符串,以便用户可以在键入时更正它?答案是检查您的配置中是否支持扩展名stty,以及该扩展名是否在您看到问题时生效 传统上,终端驱动程序在收到擦除字符时从输入中删除一个字节。然而,UTF-8是一种多字节编码(每个字符有多个字节),通过这种方式可以更好地满

下面是一个简单的PHP测试脚本:

下一次启动时,我键入“ППцццц”,然后按backspace,然后再次按“τ”:

当我按下backspace键时,似乎只删除了输入序列中的一个字节,而所有字符的长度都是两个字节


是否有一种方法可以从输入中获取字符串,以便用户可以在键入时更正它?

答案是检查您的配置中是否支持扩展名
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;