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" -> ??äö 123434和echo åäöåäö 1234- > ??äöåäö 1234 1234.
EDIT2(已解决):
问题是chcp 65001,现在我使用chcp 437(chcp 437).非常感谢Timothy Martens!
可能的方法:
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)
| 归档时间: |
|
| 查看次数: |
3062 次 |
| 最近记录: |