tabla letras lenguaje imprimir htmlentities especiales ejemplo dev convertir codigo caracteres caracter php character-encoding stdin fgets

php - letras - Cómo leer caracteres no ASCII de la entrada estándar CLI



imprimir codigo ascii en dev c++ (2)

Creo que eso sucede porque PHP 5.3 no admite caracteres multibyte correctamente.

Estos caracteres: ÅÄÖåäö

Son binarios: c3 85 c3 84 c3 96 c3 a5 c3 a4 c3 b6 (sin lista de materiales al comienzo)

Citando PHP String :

Una cadena es una serie de caracteres, donde un carácter es igual a un 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 el resultado final, porque el navegador / lector entiende caracteres multibyte, pero para CMD y STDIN buffer es ÅÄÖåäö (12 caracteres / bytes char array).

solo las funciones MB manejan operaciones básicas de cadenas multibyte.

Si å en CMD, los objetos dejan de esperar para obtener más información y el ciclo se ejecuta hasta que ctrl-c . Si escribo un carácter "normal" como a-z0-9!? (), Funciona como se esperaba.

chcp 65001 el código en CMD en Windows 7 con UTF-8 como charset ( 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 charset a chcp 1252 el bucle no se rompe cuando chcp 1252 å y se imprime "> å", pero el "ÅÄÖåäö funciona aquí" se convierte en "à ... Ã" Ã-à ¥ äö ¡trabaje 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 solucionar esto?

EDITAR:

También encontré un error extraño. echo "öäåÅÄÖåäö work here! Or?".chr(10); -> äåÅÄÖåäö work here! Or? re! Or? äåÅÄÖåäö work here! Or? re! Or? . Si el primer carácter en eco es å/ä/ö , imprime caracteres extraños Y el resultado final es duplicado con n - 1 ... (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!


Solución posible:

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

Notas: No pude reproducir su error usando múltiples versiones de PHP. Usar la siguiente versión de PHP 5.3.8 no me dio problemas

PHP 5.3 (5.3.8) VC9 x86 Non Thread Safe (2011-Aug-23 12:26:18) Arcitechture es Win XP SP3 de 32 bits

Puede intentar actualizar PHP.

Descargué php-5.3.5-nts-Win32-VC6-x86 y no pude reproducir su error, funciona bien para mí.

Editar: adicionalmente escribí los caracteres usando mi teclado español.

Edit2:

Comando CMD:

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 öïü öïü >öïü