如何从CLI标准输入中读取非ASCII字符

Saw*_*wny 16 php stdin fgets character-encoding

如果我键入åCMD,fgets将停止等待更多输入,并且循环运行直到我按下ctrl-c.如果我输入像a-z0-9这样的"普通"字符!?()它按预期工作.

我在Windows 7下使用UTF-8作为charset(chcp 65001)在CMD中运行代码,文件保存为UTF-8而不是bom.我使用PHP 5.3.5(cli).

<?php

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

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

?>
Run Code Online (Sandbox Code Playgroud)

如果我将字符集更改为chcp 1252循环不会在我键入时打破å并且打印">å"但是"ÅÄÖåäö在这里工作"变成"Ã...Ã"Ã-Ã¥ÃÃ在这里工作!".我知道我可以将文件更改为ANSI,但是我不能使用像╠╦╗这样的特殊字符.

那么为什么fgets在输入åäö之后会停止等待用户输入?

我该如何解决这个问题?

编辑:

还发现了一个奇怪的bug. echo "öäåÅÄÖåäö work here! Or?".chr(10);- > ??äåÅÄÖåäö work here! Or? re! Or?.如果echo中的第一个字符是å/ä/ö打印奇怪的字符,那么结束输出副本的n - 1字符为char ..(n =字符串开头的åäö的数字).

例如:echo "åäö 1234" -> ??äö 123434echo åäöåäö 1234- > ??äöåäö 1234 1234.

EDIT2(已解决):

问题是chcp 65001,现在我使用chcp 437(chcp 437).非常感谢Timothy Martens!

Tim*_*ens 5

可能的方法:

echo '>'; 
$line = stream_get_line(STDIN, 999999, PHP_EOL);
Run Code Online (Sandbox Code Playgroud)

注意:我无法使用多个版本的PHP重现您的错误.使用以下PHP版本5.3.8没有给我任何问题

PHP 5.3(5.3.8)VC9 x86非线程安全(2011年8月23日12:26:18)Arcitechture是Win XP SP3 32位

您可以尝试升级PHP.

我下载了php-5.3.5-nts-Win32-VC6-x86并且无法重现你的错误,它对我来说很好.

编辑:Additionaly我用西班牙语键盘输入了字符.

EDIT2:

CMD命令:

chcp 437
Run Code Online (Sandbox Code Playgroud)

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";
}
?>
Run Code Online (Sandbox Code Playgroud)

输出:

test
ASCII
test
>test
öïü

öïü
>öïü
Run Code Online (Sandbox Code Playgroud)