2011-11-30 32 views
16

Nếu tôi nhập å trong CMD, fgets ngừng chờ nhập thêm và vòng lặp chạy cho đến khi tôi nhấn ctrl-c. Nếu tôi gõ một ký tự "bình thường" như a-z0-9!?() Nó hoạt động như mong đợi.Cách đọc ký tự không phải ASCII từ đầu vào tiêu chuẩn CLI

Tôi chạy mã trong CMD dưới Windows 7 với UTF-8 làm bảng mã (chcp 65001), tệp được lưu dưới dạng UTF-8 không có bom. Tôi sử dụng PHP 5.3.5 (cli).

<?php 

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

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

?> 

Nếu tôi thay đổi charset để chcp 1252 vòng lặp không phá vỡ khi tôi gõ å và nó in "> å" nhưng "ÅÄÖåäö làm việc ở đây" trở thành "à ... ÓÃ-à ¥ äà ¶ làm việc ở đây!". Và tôi biết rằng tôi có thể thay đổi tệp thành ANSI, nhưng sau đó tôi không thể sử dụng các ký tự đặc biệt như ╠╦╗.

Vậy tại sao fgets ngừng chờ userinput sau khi tôi đã nhập åäö?

Và làm cách nào để khắc phục sự cố này?

EDIT:

Cũng tìm thấy một lỗi lạ. echo "öäåÅÄÖåäö work here! Or?".chr(10); ->��äåÅÄÖåäö work here! Or? re! Or?. Nếu char đầu tiên trong tiếng vang là å/ä/ö nó in ký tự lạ và kết quả đầu ra cuối cùng với n - 1 char .. (n = số của åäö vào đầu chuỗi).

Ví dụ: echo "åäö 1234" -> ??äö 123434echo åäöåäö 1234 ->??äöåäö 1234 1234.

EDIT2 (giải quyết):

Vấn đề là chcp 65001, bây giờ tôi sử dụng chcp 437 (chcp 437). Cảm ơn Timothy Martens!

+0

Một số câu hỏi về vấn đề này: 1) điều gì sẽ xảy ra khi bạn cố gắng nhập và 'å' trong CMD bên ngoài của php? 2) Nó chỉ là hợp lý mà một UTF-8 'Å' không giống như một cửa sổ-1252' Å' do đó kết quả 'Ã'. Nhưng điều gì sẽ xảy ra nếu bạn cố chuyển đổi tệp PHP thành windows-1252? – Qqwy

+0

** 1) ** åäö -> "lệnh không thích", echo åäö -> åäö. Vì vậy, nó hoạt động. Cả hai đều có 'chcp 65001' (UTF-8) và' chcp 1252'. ** 2) ** Tôi sử dụng UTF-8 trong cmd VÀ làm bảng mã cho tệp PHP. Nếu tôi sử dụng windows-1252 trong tập tin PHP không có gì thay đổi. Tôi nghĩ rằng vấn đề là trong windows/PHP. Khi tôi sử dụng 'chcp 1252' nó làm việc cho ÅÄÖ (ngay cả khi tệp PHP là UTF-8), nhưng sau đó tôi không thể sử dụng ╠╦╗ vv – Sawny

+0

Người đàn ông, một câu hỏi thú vị ^^. Bạn thực sự có sự chú ý của tôi bây giờ. Tôi sẽ thử nghiệm bản thân một chút, và tôi sẽ nói với bạn ngay sau khi tôi tìm thấy bất cứ điều gì. – Qqwy

Trả lời

5

giải pháp có thể:

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

Ghi chú: tôi đã không thể tái sản xuất lỗi bằng cách sử dụng nhiều phiên bản của PHP. Sử dụng phiên bản PHP sau 5.3.8 đã cho tôi không có vấn đề

PHP 5.3 (5.3.8) VC9 x86 Non Chủ đề an toàn (2011-Aug-23 00:26:18) Arcitechture là Win XP SP3 32 bit

Bạn có thể thử nâng cấp PHP.

Tôi đã tải xuống php-5.3.5-nts-Win32-VC6-x86 và không thể tạo lại lỗi của bạn, nó hoạt động tốt cho tôi.

Chỉnh sửa: Bổ sung Tôi đã nhập các ký tự bằng bàn phím tiếng Tây Ban Nha.

Edit2:

CMD Command:

chcp 437 

PHP Code:

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

Output:

test 
ASCII 
test 
>test 
öïü 

öïü 
>öïü 
+0

** 1) ** 'stream_get_line' không hoạt động. ** 2) ** Tôi đã tải xuống 'VC9 x86 Non Thread Safe (2011-Aug-23 12:26:18)' ngay bây giờ, nhưng nó không hoạt động. Bạn đã sử dụng bộ ký tự nào trong CMD và trong mã của mình? Btw tôi chạy W7 64bit. – Sawny

+0

@Timoth Martens Trên cửa sổ cmd, nó sẽ không là 'stream_get_line (STDIN, 999999, PHP_EOL);'? Tôi đã cập nhật câu trả lời của bạn dù sao đi nữa. +1 anyway. có vẻ như là giải pháp tốt nhất cho đến nay. –

+1

** NOTE **: Tôi vừa thử nghiệm điều này trên máy Mac của mình bằng cách sử dụng PHP 5.3.6 và PHP 5.2.14 và cả hai đều hoạt động. –

2

Tôi nghĩ điều đó xảy ra vì PHP 5.3 không hỗ trợ đúng cách multibyte c haracters.

Những chars: ÅÄÖåäö

Are nhị phân: c3 85 c3 84 c3 96 c3 a5 c3 a4 c3 b6 (không BOM tại beggining)

Trích dẫn PHP String:

Một chuỗi là chuỗi các ký tự, nơi một nhân vật cũng giống như một byte. Điều này có nghĩa là PHP chỉ hỗ trợ một bộ 256 ký tự, và do đó không cung cấp hỗ trợ Unicode nguyên gốc. Xem chi tiết về loại chuỗi.

Thông thường không ảnh hưởng đến kết quả cuối cùng vì trình duyệt/người đọc hiểu các ký tự nhiều byte, nhưng đối với bộ đệm CMD và STDIN là ÅÄÖåäö (12 chars/byte char array).

chỉ MB functions xử lý các chuỗi nhiều chuỗi hoạt động cơ bản.

+0

Có Tôi biết về các chức năng MB, nhưng họ không có bất kỳ chức năng tài nguyên đọc :( – Sawny

Các vấn đề liên quan