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" -> ??äö 123434
và echo åäöåäö 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!
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
** 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
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