2016-08-11 3 views
10

Китайские символы могут отображаться и вводиться на моем LXTerminal.Как ввести китайские символы в php cli?

[email protected]:/home/debian8# 中文 \\now to input chinese characters on my LXTerminal,it means chinese characters can be inputted. 
bash: 中文: command not found \\ bash react the chinese characters on my LXTerminal,it means chinese characters can be displayed.  

Китайские символы могут быть введены и отображены на моей оболочке python.
enter image description here Теперь давайте ввести в PHP CLI (или сказать PHP оболочки)

enter image description here

enter image description here китайские иероглифы исчезли, когда нажать клавишу ввода.
Это означает, что китайские символы могут отображаться, но не могут быть введены в режиме php cli.
Как заставить китайские символы вводить в режиме php cli?
И это подтвержденный факт, что китайские символы не могут быть вставлены в php cli.
Возможно, некоторые атрибуты mbstring будут отредактированы в /etc/php5/cli/php.ini?

Благодарим bwoebi. Три факта добавлены, чтобы перейти к моим исследованиям.
1. Версии libreadline и libedit.

[email protected]:/home/debian8# find/-name 'libreadline*' 
/lib/x86_64-linux-gnu/libreadline.so.6.3 
/lib/x86_64-linux-gnu/libreadline.so.6 


[email protected]:/home/debian8# find/-name 'libedit*' 
/usr/lib/x86_64-linux-gnu/libedit.so.2 
/usr/lib/x86_64-linux-gnu/libedit.so.2.0.51 
/usr/share/lintian/overrides/libedit2 

[email protected]:/Главная/debian8 # LDD "$ (который PHP)"

linux-vdso.so.1 (0x00007ffd35e5c000) 
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007ff98ac68000) 
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff98aa4d000) 
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007ff98a836000) 
libonig.so.2 => /usr/lib/x86_64-linux-gnu/libonig.so.2 (0x00007ff98a5cc000) 
libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007ff98a1d0000) 
libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007ff989f6f000) 
libdb-5.3.so => /usr/lib/x86_64-linux-gnu/libdb-5.3.so (0x00007ff989bae000) 
libqdbm.so.14 => /usr/lib/libqdbm.so.14 (0x00007ff989961000) 
libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007ff989751000) 
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007ff9894e3000) 
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff9892db000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff988fda000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff988dd6000) 
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007ff988bbe000) 
libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00007ff988857000) 
libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007ff98860c000) 
libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007ff988338000) 
libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007ff988107000) 
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007ff987f03000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff987b58000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff98793b000) 
/lib64/ld-linux-x86-64.so.2 (0x00007ff98ae9f000) 
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007ff987718000) 
libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007ff98750c000) 
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007ff987308000) 

3.CHINESE символы на php7 -a
php7 был установлен как
http://www.tecmint.com/install-and-compile-php-7-on-centos-7-and-debian-8/
Китайские символы могут отображаться и вводиться на php7 -a.

Новое открытие!
Это библиотека readline на php7.

php7 -i |grep Readline 
Readline Support => enabled 
Readline library => 6.3 

Это оболочка EditLine на php5.

php -i |grep Readline 
Readline Support => enabled 
Readline library => EditLine wrapper 

Проблема в полурешении.
Как заставить мой php5 использовать библиотеку Readline 6.3, как php7?
Я не хочу снова компилировать свой php5, просто чтобы изменить библиотеку?
Сегодня я скомпилировать php5 в моей VirtualBox с помощью команды:

./configure \ 
--prefix=/usr/local/php5.6 \ 
--with-config-file-path=/usr/local/php5.6/etc \ 
--with-readline 

китайские символы могут быть введены и отображаются на php -a интерактивном режиме.
Неразумно удалять текущий php5 и скомпилировать все с самого начала.

find/-name 'readline.so*' 
/usr/lib/php5/20131226/readline.so 
/usr/lib/x86_64-linux-gnu/libreadline.so 
/usr/lib/x86_64-linux-gnu/ruby/2.1.0/readline.so 
/usr/lib/x86_64-linux-gnu/libguilereadline-v-18.so.18 
/usr/lib/x86_64-linux-gnu/libguilereadline-v-18.so 
/usr/lib/x86_64-linux-gnu/libguilereadline-v-18.so.18.0.0 
/usr/lib/python2.7/lib-dynload/readline.x86_64-linux-gnu.so 
/lib/x86_64-linux-gnu/libreadline.so.6.3 
/lib/x86_64-linux-gnu/libreadline.so.6 

Может быть для того, чтобы /lib/x86_64-linux-gnu/libreadline.so.6.3, как заставить его работать на моей php5?

+0

Почему ваша команда называется на китайском? – Justinas

+0

Я хочу проверить, что китайские символы могут быть введены и отображены на моем LXTerminal. –

+2

Я не понимаю, как факт, что ваша оболочка или терминал преобразует ваши входы в китайский язык, имеет какое-то отношение к PHP? PHP не обрабатывает ввод на терминале, ваша оболочка. – AntoineB

ответ

1

php -a использует libreadline или libedit в качестве базовых библиотек.

Внутри readline_shell_run() функция в ext/readline/readline.c, PHP вызывает библиотечную функцию readline(). Таким образом, проблема заключается не в самом PHP, а в используемой библиотеке.

На моем терминале OS X [libedit 3.0.0] он отлично работает, вставляет и переходит в CLI.

Итак, чтобы выяснить, что вы используете libreadline? или libedit? (проверьте версию и библиотеку, используемую с ldd "$(which php)"). Изучите, имеет ли версия libedit или libreadline, используемая вашей установкой PHP, известные ошибки с кодировкой используемого терминала.

Если есть более новые версии библиотек, возможно, вам захочется попытаться их установить и проверить, не пропала ли проблема.

Смежные вопросы