繁体   English   中英

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

[英]How to read non-ASCII characters from CLI standard input

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

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

<?php

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

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

?>

如果我将charset更改为chcp 1252 ,当我输入å并且打印“>å”时,循环不会中断,但是“ÅÄÖåöö在这里工作”变成“Ã...ÔÃ-åöö在这里工作!“。 我知道我可以将文件更改为ANSI,但是我不能使用像╠╦╗这样的特殊字符。

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

我该如何解决这个问题?

编辑:

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

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

EDIT2(已解决):

问题是chcp 65001 ,现在我使用chcp 437chcp 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非线程安全(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

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 5.3不支持正确的多字节字符。

这些字符: ÅÄÖåäö

是二进制: c3 85 c3 84 c3 96 c3 a5 c3 a4 c3 b6 (开始时没有BOM)

引用PHP字符串

字符串是一系列字符,其中字符与字节相同。 这意味着PHP仅支持256个字符集,因此不提供本机Unicode支持。 查看字符串类型的详细信息。

通常不影响最终结果,因为浏览器/阅读器理解多字节字符,但对于CMD和STDIN缓冲区是ÅÄÖåäö (12个字符/字节字符数组)。

只有MB函数处理多字节字符串基本操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM