如果我在CMD中输入å
,fgets停止等待更多输入,并且循环运行,直到我按ctrl-c
。如果我输入“正常”字符,如a-z0-9!?(),则按预期工作。如何从CLI标准输入读取非ASCII字符
我使用UTF-8作为字符集(chcp 65001
)在Windows 7下运行CMD中的代码,该文件保存为UTF-8而不包含bom。我使用PHP 5.3.5(cli)。
<?php
echo "ÅÄÖåäö work here.\n";
while(1)
{
echo '> '. fgets(STDIN);
}
?>
如果我改变字符集来chcp 1252
当我输入å
并打印“>一个”但是“ÅÄÖåäö在这里工作”成为“......一个个”-A¥Ã¤Ã循环不破¶在这里工作!“。而且我知道我可以将文件更改为ANSI,但是我不能使用像╠╦╗这样的特殊字符。
那么为什么fgets在输入åäö后停止等待userinput?
我该如何解决这个问题?
编辑:
还发现了一个奇怪的错误。 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!
关于这个问题的几个问题:1)当你尝试在PHP之外的CMD中键入和“å”时会发生什么? 2)UTF-8''与Windows-1252''不一样是合乎逻辑的,因此产生''。但是如果您尝试将PHP文件转换为Windows-1252,会发生什么情况? – Qqwy
** 1)**åäö - >“命令不喜欢”,echoåäö - >åäö。所以它工作。两者都使用'chcp 65001'(UTF-8)和'chcp 1252'。 ** 2)**我在cmd中使用UTF-8,并将其作为PHP文件的字符集。如果我在PHP文件中使用windows-1252,则不会有任何更改。我认为这个问题是在Windows/PHP中。当我使用'chcp 1252'时,它适用于ÅÄÖ(即使PHP文件是UTF-8),但后来我不能使用╠╦╗等。 – Sawny
男人,多么有趣的问题^^。你现在真的有我的注意力。我将尝试一下自己,我会尽快告诉你。 – Qqwy