CLI多字节输入

时间:2017-09-04 17:46:37

标签: php utf-8 command-line-interface multibyte

我在通过PHP CLI接收多字节字符时遇到问题。 我有一个从STDIN读取的小脚本:

<?php

while(true) {

  # also not working, but is similar to fgets anyway, except you can specify the ending char, so no surprise
  #$strInput = trim(stream_get_line(STDIN, 1024, PHP_EOL));
  $strInput = trim(fgets(STDIN, 1024));

  var_dump($strInput);

}

基本上这可行,但如果输入任何非ASCI字符,我会遇到问题, 然后使用退格键。

e.g. input = 'ß' // string(2) "ß"
e.g. input = 'ß' and backspace // string(1) "�"
e.g. input = 'ß' and backspace twice // string(0) ""

我不知道这是PHP还是终端问题。我倾向于认为这是一个PHP问题。 它适用于我的终端:

e.g. % ß // ß: Command not found 
e.g. % ßß and backspace // ß: Command not found

不幸的是,没有从STDIN读取的mb_ *函数。

以下是我的终端设置:

% locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_COLLATE=C
LC_TIME="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_ALL=

% stty -a
speed 38400 baud; 58 rows; 212 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 -ignbrk
        brkint -inpck -ignpar -parmrk
oflags: opost onlcr -ocrnl tab0 -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
        -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
        eol2 = <undef>; erase = ^H; erase2 = ^H; intr = ^C; kill = ^U;
        lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q;
        status = ^T; stop = ^S; susp = ^Z; time = 0; werase = ^W;

% cat /home/foobar/.login_conf 
# $FreeBSD: releng/10.2/share/skel/dot.login_conf 77995 2001-06-10 17:08:53Z ache $
#
# see login.conf(5)
#
me:\
        :charset=UTF-8:\
        :lang=de_DE.UTF-8:\
        :setenv=LC_COLLATE=C:

我使用FreeBSD 10.3和最新的PHP 7.1.9。 我也尝试过像bash这样的不同shell,但输出仍然相同。 还尝试用-u8选项启动xterm,但没有成功。

有人知道如何解决这个问题吗?我错过了什么?

0 个答案:

没有答案