足够简单,可以测试:
echo(~~"Hello World"); //Echos Hello World
echo(~"Hello World"); //Echos �����ߨ����
echo(~"�����ߨ����"); //Echos @B@B@B@B@B W@B@B@B@B
为什么它直接在两个Nots之间正常工作,而不是复制和粘贴的字符串输出?
我猜可能有些数据在某处丢失了,但是如何以这样的方式输出数据:如果我将其复制并粘贴到代码中找不到它的代码,它实际上会起作用?
这一直困扰着我和其他一些我知道很久的人!
答案 0 :(得分:2)
这是因为您看到的char具有无效(不存在)代码。
例如H
代码为72
。 ~72
为-73
。
只要它不是有效的字符且无法显示 - 它就会显示为带问号的正方形。因此无法将其翻译回来,因为您无法使用代码-73 复制 char(或者更准确地说 - 您的记事本或操作系统无法执行此操作)
答案 1 :(得分:1)
Ascii H是0100 1000或字符72,~H是1011 0111或字符183.这超出了128的基本Ascii表。
鉴于PHP没有规定字符串的特定编码,所产生的字符将取决于脚本的代码页。
这可能是不可打印的字符(因此用represented表示),当您复制/粘贴时,它们会被符号replaced替换。
有关将字符串实现为字节数组的更多详细信息,请参阅Php Strings。
答案 2 :(得分:1)
如前所述,问题是您尝试回显的字符是不可打印的。您可以检查此脚本的各个步骤中发生了什么,以查看如果确实需要存储并稍后检索它,您可以执行的操作。
$a = "Hello World";
$b = ~$a;
$chars = unpack("c11chars", $b);
foreach ($chars as $char) {
echo $char . ' = ' ;
echo chr($char) . "\n";
}
$out = '';
foreach ($chars as $char) {
$out .= pack("c", $char);
}
echo ~$out;
输出:
-73 = ?
-102 = ?
-109 = ?
-109 = ?
-112 = ?
-33 = ?
-88 = ?
-112 = ?
-115 = ?
-109 = ?
-101 = ?
Hello World
?
是我的回应,因为它们是不可打印的。