2011-11-30 35 views
16

Si escribo å en CMD, los datos dejan de esperar para obtener más información y el ciclo se ejecuta hasta que presiono ctrl-c. Si escribo un carácter "normal" como a-z0-9!?(), Funciona como se esperaba.Cómo leer caracteres no ASCII de la entrada estándar CLI

Ejecuto el código en CMD en Windows 7 con UTF-8 como conjunto de caracteres (chcp 65001), el archivo se guarda como UTF-8 sin bom. Yo uso PHP 5.3.5 (cli).

<?php 

echo "ÅÄÖåäö work here.\n"; 

while(1) 
{ 
    echo '> '. fgets(STDIN); 
} 

?> 

Si cambio de juego de caracteres a chcp 1252 el bucle no se rompe cuando escribo å y de impresión "> A", pero el "ÅÄÖåäö trabajan aquí" convertido "un ...“A-A ¥ äà ¶ ¡Trabaja aquí!". Y sé que puedo cambiar el archivo a ANSI, pero luego no puedo usar caracteres especiales como ╠╦╗.

Entonces, ¿por qué los fgets dejan de esperar la entrada de usuario después de haber tipeado åäö?

¿Y cómo puedo solucionarlo?

EDIT:

encuentra también un bicho raro. echo "öäåÅÄÖåäö work here! Or?".chr(10); ->��äåÅÄÖåäö work here! Or? re! Or?. Si el primer carácter en eco es å/ä/ö imprime caracteres extraños Y el resultado final duplicado con n - 1 caracteres ... (n = número de åäö en el comienzo de la cadena).

Por ejemplo: echo "åäö 1234" -> ??äö 123434 y echo åäöåäö 1234 ->??äöåäö 1234 1234.

Edit2 (resuelto):

El problema era chcp 65001, ahora uso chcp 437 (chcp 437). ¡Muchas gracias a Timothy Martens!

+0

Algunas preguntas sobre este problema: 1) ¿qué sucede cuando intenta escribir y 'å' en el CMD fuera del php? 2) Es lógico que un UTF-8 'Å' no sea lo mismo que un Windows-1252' Å', por lo tanto, el 'Ã' resultante. ¿Pero qué ocurre si tratas de convertir el archivo PHP a windows-1252? – Qqwy

+0

** 1) ** åäö -> "comando no me gusta", echo åäö -> åäö. Entonces funciona Ambos con 'chcp 65001' (UTF-8) y' chcp 1252'. ** 2) ** Uso UTF-8 en cmd AND como juego de caracteres para el archivo PHP. Si utilizo Windows-1252 en el archivo PHP, nada cambia. Creo que el problema está en Windows/PHP. Cuando uso 'chcp 1252' funciona para ÅÄÖ (incluso si el archivo PHP es UTF-8), pero no puedo usar ╠╦╗ etc. – Sawny

+0

Hombre, qué pregunta tan interesante ^^. Realmente tienes mi atención ahora. Voy a experimentar conmigo mismo un poco, y te contaré tan pronto como encuentre algo. – Qqwy

Respuesta

5

Posible solución:

echo '>'; 
$line = stream_get_line(STDIN, 999999, PHP_EOL); 

Notas: que era incapaz de reproducir el error utilizando múltiples versiones de PHP. Usando la siguiente versión de PHP 5.3.8 me dio ningún problema

PHP 5.3 (5.3.8) VC9 x86 no seguro para subprocesos (2011-Sep-23 12:26:18) arcitechture es Win XP SP3 32 bit

Puede intentar actualizar PHP.

He descargado php-5.3.5-nts-Win32-VC6-x86 y no he podido reproducir su error, funciona bien para mí.

Editar: Additionaly Escribí los caracteres usando mi teclado español.

Edit2:

CMD Comando:

chcp 437 

Código PHP:

<?php 
$fp=fopen("php://stdin","r"); 
while(1){ 
    $str = fgets(STDIN); 
    echo mb_detect_encoding($str)."\n"; 
    echo '>'.stream_get_line($fp,999999,"\n")."\n"; 
} 
?> 

Salida:

test 
ASCII 
test 
>test 
öïü 

öïü 
>öïü 
+0

** 1) ** 'stream_get_line' no funcionó. ** 2) ** Descargué 'VC9 x86 Non Thread Safe (2011-Aug-23 12:26:18)' ahora, pero no funcionó. ¿Qué juego de caracteres usaste en CMD y en tu código? Por cierto, ejecuto W7 64 bits. – Sawny

+0

@Timoth Martens En windows cmd no sería 'stream_get_line (STDIN, 999999, PHP_EOL);'? Actualicé tu respuesta de todos modos. +1 de todos modos. parece ser la mejor solución hasta ahora. –

+1

** NOTA **: Acabo de probar esto en mi Mac usando PHP 5.3.6 y PHP 5.2.14 y ambos funcionaron. –

2

Creo que esto sucede debido a que PHP 5.3 no admite correctamente multibyte c personajes.

Estos caracteres: ÅÄÖåäö

son binarios: c3 85 c3 84 c3 96 c3 a5 c3 a4 c3 b6 (sin lista de materiales en beggining)

Citando PHP String:

Una cadena es una serie de caracteres, donde un personaje es lo mismo que una byte. Esto significa que PHP solo admite un conjunto de 256 caracteres y, por lo tanto, no ofrece compatibilidad nativa con Unicode. Ver detalles del tipo de cadena.

Normalmente no afecta al resultado final, ya que el navegador/lector a comprender caracteres de varios bytes, pero para CMD y tampón STDIN es ÅÄÖåäö (12 caracteres/bytes carbón matriz).

solo MB functions manipular cadenas multibyte operaciones básicas.

+0

Sí, sé sobre las funciones de MB, pero no tienen ninguna función de recurso de lectura :( – Sawny

Cuestiones relacionadas