2016-08-11 16 views
10

Chińskie znaki mogą być wyświetlane i wprowadzane na moim LXTerminal.Jak wprowadzić chińskie znaki w 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.  

Chińskie znaki mogą być wprowadzane i wyświetlane na mojej powłoce Pythona.
enter image description here Teraz wchodzi w php CLI (lub powiedzieć php shell)

enter image description here

enter image description here chińskie znaki zniknęły, kiedy kliknij enter.
oznacza to, że chińskie znaki mogą być wyświetlane, ale nie można ich wstawić w trybie php cli.
Jak wprowadzić znaki chińskie w trybie php cli?
Jest to sprawdzony fakt, że chińskich znaków nie można wkleić również do php cli.
Może niektóre atrybuty mbstring zostaną zmienione w /etc/php5/cli/php.ini?

Dziękuję bwoebi. Trzy fakty dodane, aby przejść do moich badań.
1. Wersje libreadline i 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]:/home/debian8 # ldd "$ (co 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 znaki na php7 -a
php7 został zainstalowany jako
http://www.tecmint.com/install-and-compile-php-7-on-centos-7-and-debian-8/
Chińskie znaki mogą być wyświetlane i wprowadzane na php7 -a.

Jest nowe odkrycie!
To jest biblioteka readline na php7.

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

Jest to opakowanie EditLine na php5.

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

Problem jest w połowie rozwiązany status.
Jak zrobić, aby mój php5 korzystał z biblioteki Readline 6.3 w wersji php7?
Nie chcę ponownie kompilować mojego php5, tylko po to, żeby zmienić bibliotekę?
dzisiaj skompilować php5 w moim VirtualBox z poleceniem:

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

chińskie znaki mogą być wprowadzane i wyświetlane na php -a trybie interaktywnym.
To nierozsądne, aby usunąć bieżący php5 i skompilować wszystko od początku.

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 

Może włączyć /lib/x86_64-linux-gnu/libreadline.so.6.3, jak sprawić, by pracować dla mojego PHP5?

+0

Dlaczego nazwa twojego polecenia pochodzi od chińskiego? – Justinas

+0

Chcę sprawdzić, czy chińskie znaki mogą być wprowadzane i wyświetlane na moim LXTerminal. –

+2

Nie rozumiem, w jaki sposób fakt, że twoja powłoka lub terminal przekształca twoje chińskie znaki wejściowe ma coś wspólnego z PHP? PHP nie obsługuje wejścia na terminalu, twoja powłoka jest. – AntoineB

Odpowiedz

1

php -a używa biblioteki libreadline lub biblioteki libedit jako bibliotek bazowych.

Wewnątrz funkcji readline_shell_run() w ext/readline/readline.c, PHP wywołuje funkcję biblioteczną readline(). Problem nie leży w samym PHP, ale w używanej bibliotece.

Na moim terminalu OS X [libedit 3.0.0] działa poprawnie, wkleja i przekazuje do CLI.

Aby dowiedzieć się, na czym polega problem, co używasz libreadline? lub libedit? (sprawdź wersję i bibliotekę używaną z ldd "$(which php)") Sprawdź, czy wersja libedit lub libreadline używanej przez ciebie instalacji PHP ma znane błędy z kodowaniem używanego terminala.

Jeśli są nowsze wersje bibliotek, możesz spróbować zainstalować je zamiast tego i sprawdzić, czy problem zniknął.