2011-11-30 8 views
16

Se si immette å in CMD, fget smette di attendere ulteriori input e il ciclo viene eseguito finché non si preme ctrl-c. Se digito caratteri "normali" come a-z0-9!?() Funziona come previsto.Come leggere caratteri non ASCII dall'input standard CLI

Eseguo il codice in CMD in Windows 7 con UTF-8 come set di caratteri (chcp 65001), il file viene salvato come UTF-8 senza bom. Io uso PHP 5.3.5 (cli).

<?php 

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

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

?> 

Se cambio charset al chcp 1252 il ciclo non si rompe quando digito å e Stampa "> un" ma la "ÅÄÖåäö lavorano qui" diventare "à ... ÓÃ-à ¥ äà ¶ lavoro qui!". E so che posso cambiare il file in ANSI, ma poi non posso usare caratteri speciali come ╠╦╗.

Quindi perché fget smette di attendere l'input dell'utente dopo aver digitato åäö?

E come posso risolvere questo?

EDIT:

trovato anche uno strano bug. echo "öäåÅÄÖåäö work here! Or?".chr(10); ->��äåÅÄÖåäö work here! Or? re! Or?. Se il primo carattere in eco è å/ä/ö, stampa caratteri sconosciuti e il risultato finale è duplicato con il carattere n - 1 .. (n = numero di åäö all'inizio della stringa).

Ad esempio: echo "åäö 1234" -> ??äö 123434 e echo åäöåäö 1234 ->??äöåäö 1234 1234.

EDIT2 (risolto):

Il problema era chcp 65001, ora uso chcp 437 (chcp 437). Grazie mille a Timothy Martens!

+0

Alcune domande su questo problema: 1) cosa succede quando provi a digitare e 'å' nel CMD al di fuori del php? 2) È logico che un 'Å' UTF-8 non sia lo stesso di un windows-1252' Å', quindi il 'Ã' risultante. Ma cosa succede se provi a convertire il file PHP in windows-1252? – Qqwy

+0

** 1) ** åäö -> "comando non affezionato", echo åäö -> åäö. Quindi funziona. Entrambi con 'chcp 65001' (UTF-8) e' chcp 1252'. ** 2) ** Uso UTF-8 in cmd AND come set di caratteri per il file PHP. Se uso Windows-1252 nel file PHP non cambia nulla. Penso che il problema sia in Windows/PHP. Quando uso 'chcp 1252' funziona per ÅÄ (anche se il file PHP è UTF-8), ma non posso usare ╠╦╗ ecc. – Sawny

+0

Man, che domanda interessante ^^. Hai davvero la mia attenzione ora. Ho intenzione di sperimentare me stesso per un po ', e ti dirò non appena avrò trovato qualcosa. – Qqwy

risposta

5

Possibile soluzione:

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

Note: non sono riuscito a riprodurre l'errore utilizzando più versioni di PHP. Utilizzando il seguente versione PHP 5.3.8 mi ha dato nessun problema

PHP 5.3 (5.3.8) VC9 x86 non Discussione Sicuro (2011-Ago-23 12:26:18) Arcitechture è Win XP SP3 32 bit

Si potrebbe provare l'aggiornamento di PHP.

Ho scaricato php-5.3.5-nts-Win32-VC6-x86 e non è stato in grado di riprodurre l'errore, funziona correttamente per me.

Modifica: Additionaly Ho digitato i caratteri usando la mia tastiera spagnola.

Edit2:

CMD Comando:

chcp 437 

codice 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"; 
} 
?> 

uscita:

test 
ASCII 
test 
>test 
öïü 

öïü 
>öïü 
+0

** 1) ** 'stream_get_line' non ha funzionato. ** 2) ** Ho scaricato 'VC9 x86 Non Thread Safe (2011-Aug-23 12:26:18)' ora, ma non ha funzionato. Quale charset hai usato in CMD e nel tuo codice? A proposito corro W7 a 64 bit. – Sawny

+0

@Timoth Martens Su windows cmd non sarebbe 'stream_get_line (STDIN, 999999, PHP_EOL);'? Ho comunque aggiornato la tua risposta. +1 comunque. sembra la soluzione migliore finora. –

+1

** NOTE **: l'ho appena testato sul mio Mac usando PHP 5.3.6 e PHP 5.2.14 e funzionavano entrambi. –

2

Penso che ciò accada perché PHP 5.3 non supporta correttamente multibyte c haracters.

Questi caratteri: ÅÄÖåäö

sono binari: c3 85 c3 84 c3 96 c3 a5 c3 a4 c3 b6 (senza BOM a beggining)

Citando PHP String:

Una stringa è una serie di caratteri, in cui un personaggio è la stessa di un byte. Ciò significa che PHP supporta solo un set di 256 caratteri, e quindi non offre supporto Unicode nativo. Vedi i dettagli del tipo di stringa.

Normalmente non influisce sul risultato finale, perché il browser/lettore capisce caratteri multibyte, ma per CMD e tampone STDIN è ÅÄÖåäö (12 caratteri/byte char array).

solo MB functions gestisce le operazioni di base delle stringhe multibyte.

+0

Sì, so delle funzioni di MB, ma non hanno alcuna funzione di risorsa di lettura :( – Sawny

Problemi correlati