Laravel의 tinker로 일본어를 입력 할 수 없어 곤란했지만 어떻게 든 이야기

TL;DR



Amazon Linux 2 또는 CentOS 7에서 손(?).

Laravel 의 tinker 1 포함하는 psysh 2 이나 PHP 의 대화 쉘 3 등으로 일본어 입력을 할 수 없었다.

libedit를 새로운 것으로 바꿔서 해소했다.



환경



환경 1(CentOS7)
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)


$ php -v
PHP 7.2.10 (cli) (built: Sep 11 2018 11:22:20) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.10, Copyright (c) 1999-2018, by Zend Technologies


$ php artisan --version
Laravel Framework 5.5.44

환경 2(AmazonLinux2)
$ cat /etc/system-release
Amazon Linux release 2 (Karoo)


$ php -v
PHP 7.2.15 (cli) (built: Feb  7 2019 20:10:03) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.15, Copyright (c) 1999-2018, by Zend Technologies


$ php artisan --version
Laravel Framework 5.5.44

발생 이벤트


echo '日清どん兵衛';를 실행하고 싶지만,
입력해도, 복사&붙여넣어도 일본어 문자열이 사라져 버린다.

대화 쉘
$ php -a
Interactive shell

php > echo '';

psysh
$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.14 — cli) by Justin Hileman
>>> echo '';

탭 보완이나 히스토리는 기능한다.

터미널이나 php.ini 설정을 의심했지만 특별한 문제는 없었습니다.

조사


$ php artisan tinker --quiet
>>> readline_info();
=> [
     "line_buffer" => "readline_info();\n",
     "point" => 0,
     "end" => 0,
     "library_version" => "EditLine wrapper",
     "readline_name" => "",
     "attempted_completion_over" => 0,
   ]
$ yum info -q libedit.x86_64
# 略


$ ldd `which php` | perl -nwlE'/(.*libedit\.so.\d+)/&&say$1'
    libedit.so.0 => /lib64/libedit.so.0


$ file /lib64/libedit.so.0
/lib64/libedit.so.0: symbolic link to `libedit.so.0.0.42'

(´・ω・`)

libedit 업데이트



설치하지 않은 경우 먼저 gcc 또는 ncurses-devel 4을 도입하십시오.
$ sudo yum install -y gcc.x86_64
$ sudo yum install -y ncurses-devel.x86_64

Editline Library (libedit) 에서 소스 코드를 얻고 컴파일한다.
$ curl https://www.thrysoee.dk/editline/libedit-20190324-3.1.tar.gz -O

$ tar zxvf libedit-20190324-3.1.tar.gz

$ cd libedit-20190324-3.1/

$ ./configure

$ make

$ sudo cp -i ./src/.libs/libedit.so.0.0.60 /lib64/

루트로 작업 (잡)
# cd /lib64/

# unlink libedit.so.0

# ln -s libedit.so.0.0.60 libedit.so.0

확인



대화 쉘
$ php -a
Interactive shell

php > echo '日清どん兵衛';
日清どん兵衛

psysh
$ php artisan tinker -q
>>> echo '日清どん兵衛';
日清どん兵衛⏎

(๑•̀ㅂ•́)و✧

완주한 감상



Google 선생님에게 물어도 비슷한 사건으로 어려움을 겪고있는 사람은 없으며,

낡은 버젼의 PHP나, mbstring 이나 readline 가 없다고 하는 것, Windows 로의 이야기나 터미널의 설정의 이야기등이 많이 히트해, 정답에 도착하지 않고 곤란했습니다.

참고 및 주석


  • I just discovered today that php -a (interactive) simply discards certain letters, can't type them, can't copy/paste, can't even load from file.
  • PsySH 탭 완성이 작동하지 않음 - Qiita
  • MySQL의 CLI에서 일본어를 입력 할 수 없습니다.



  • Laravel 5.5 Artisan 콘솔 

    psysh 

    PHP 매뉴얼 > 기능 > 명령줄 사용법 

    Error configuring libedit #3751 

    좋은 웹페이지 즐겨찾기