为什么不按位不能复制/粘贴字符串?

时间:2011-09-28 00:55:54

标签: php

足够简单,可以测试:

echo(~~"Hello World"); //Echos Hello World
echo(~"Hello World"); //Echos �����ߨ����
echo(~"�����ߨ����"); //Echos @B@B@B@B@B W@B@B@B@B

为什么它直接在两个Nots之间正常工作,而不是复制和粘贴的字符串输出?

我猜可能有些数据在某处丢失了,但是如何以这样的方式输出数据:如果我将其复制并粘贴到代码中找不到它的代码,它实际上会起作用?

这一直困扰着我和其他一些我知道很久的人!

3 个答案:

答案 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

?是我的回应,因为它们是不可打印的。