はじめに

Laravel の Tinker(PsySH)、php -a で起動する PHP の対話シェル(インタラクティブシェル)などで、日本語が入力できない(※)場合の対処方法。

(※イメージとしては 'ほげ' って入力しても Enter を押して確定した瞬間に '' となるような動作)

TL;DR

  • 恒久的な対処としては libedit の更新
  • 一時的な対処としては Unicode デコード可能な関数を定義して利用
この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. 恒久対処: libedit の更新
    2. 一時対処: Unicode デコードでの入力
  5. まとめ
  6. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat /etc/os-release
PRETTY_NAME="Amazon Linux 2"

$ php -v
PHP 7.3.17 (cli) (built: May 5 2020 19:30:20) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.17, Copyright (c) 1998-2018 Zend Technologies

$ composer info laravel/framework
name : laravel/framework
versions : * v5.7.28

$ composer info psy/psysh
name : psy/psysh
versions : * v0.9.12

詳細

恒久対処: libedit の更新

参考:

基本的に上記サイトの通り。

コマンドを以下の順で実行していけば OK。(root ユーザ前提。詳細解説は参考サイトを参照)

1
2
3
4
5
6
7
8
9
10
11
12
# yum, wget やパッケージ名などは、各環境にあわせて適宜読み替え
$ yum install -y gcc.x86_64 ncurses-devel.x86_64
$ cd /usr/local/src/
$ wget https://www.thrysoee.dk/editline/libedit-20191211-3.1.tar.gz
$ tar zxvf libedit-20191211-3.1.tar.gz
$ cd libedit-20191211-3.1/
$ ./configure
$ make
$ make install
$ cd /lib64/
$ unlink libedit.so.0
$ ln -s /usr/local/lib/libedit.so.0 libedit.so.0

一時対処: Unicode デコードでの入力

参考: PHPでUnicodeアンエスケープしたJSONを出力する関数 - オープンソースこねこね

「サーバを変更する権限が無い」など何らかの要因で、前述の対処をすぐには実行できない人向け。

以下の2関数を Tinker 上で定義。(参考サイトからそのまま引用)

1
2
3
4
5
6
7
8
function unicode_encode($str)
{
return preg_replace_callback("/\\\\u([0-9a-zA-Z]{4})/", "encode_callback", $str);
}

function encode_callback($matches) {
return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UTF-16");
}

Unicodeエスケープシーケンス変換 などのページで、入力したい文字列を Unicode 変換

例: はろーわーるど\u306f\u308d\u30fc\u308f\u30fc\u308b\u3069


unicode_encode 関数に入力すると、日本語入力不可の環境でも(無理やり)日本語を扱うことができる。
※とは言え、不便なことには間違いないので、とっとと恒久対処を行う方が良いと思う。

1
2
unicode_encode('\u306f\u308d\u30fc\u308f\u30fc\u308b\u3069')
// => 'はろーわーるど'

まとめ

  • 恒久的な対処としては libedit の更新
  • 一時的な対処としては Unicode デコード可能な関数を定義して利用

参考文献

関連記事

この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list