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

标签 php character-encoding stdin fgets

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

我在 Windows 7 下使用 UTF-8 作为字符集 (chcp 65001) 在 CMD 中运行代码,文件被保存为没有 bom 的 UTF-8。我使用 PHP 5.3.5 (cli)。

<?php

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

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

?>

如果我将字符集更改为 chcp 1252,当我键入 å 时循环不会中断,它会打印“> å”,但“ÅÄÖåäö work here”变为“ÅÄÖåäö 在这里工作!"。而且我知道我可以将文件更改为 ANSI,但是我不能使用像 ╠╦╗ 这样的特殊字符。

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

我该如何解决这个问题?

编辑:

还发现了一个奇怪的bug。 echo "öäåÅÄÖåäö 在这里工作!或者?".chr(10); -> ��äåÅÄÖåäö 在这里工作!或者?回覆!或者?。 如果 echo 中的第一个字符是 å/ä/ö,它会打印出奇怪的字符,并且最终输出与 n - 1 字符重复的字符..(n = åäö 的数量字符串的开头)。

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

EDIT2(已解决):

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

最佳答案

可能的解决方案:

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

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

PHP 5.3 (5.3.8) VC9 x86 Non Thread Safe (2011-Aug-23 12:26:18) Arcitechture is Win XP SP3 32 bit

您可以尝试升级 PHP。

我下载了 php-5.3.5-nts-Win32-VC6-x86 但无法重现您的错误,它对我来说工作正常。

编辑:另外我使用我的西类牙语键盘输入字符。

编辑2:

命令命令:

chcp 437

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

输出:

test
ASCII
test
>test
öïü

öïü
>öïü

关于php - 如何从 CLI 标准输入中读取非 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8331353/

相关文章:

javascript - SQL 查询插入值并显示,无需重新加载页面

javascript - 通过超链接传递到其他页面的数据被切断

php - 使用 PHP 的动态导航包括

mysql - 如何控制表单中的字符编码是否正确存储了法语口音

stdin - perl6 如何从标准输入读取并获取命令行参数?

php - 使用 .htaccess 进行多 url 重定向

html - 检测 HTML 中的字符编码

ruby - 如何在 Ruby 中通过 TcpSocket 发送 UTF-8 编码的字符串

c - poll() 在第一次调用后停止设置 POLLIN

python - 如何在Python中使用raw_input()在特定字符之后停止读取用户输入?