2011-09-28 45 views
2

很简单的测试:为什么不按位复制/粘贴字符串无法工作?

echo(~~"Hello World"); //Echos Hello World 
echo(~"Hello World"); //Echos �����ߨ���� 
echo(~"�����ߨ����"); //Echos @[email protected]@[email protected]@B [email protected]@[email protected]@B 

为什么会妥善两个穷人直接在彼此顶部的工作,但不能用于复制和粘贴的字符串输出?

我猜可能有一些数据丢失的地方,但我怎么能输出数据的方式,如果我复制并粘贴到代码发现按位不是它,它会实际上工作?

这一直在扰乱我和我认识的其他一些人!

+0

可能是因为shell不支持这些字符,或者您正在使用它来查看它们或者其他任何东西,但是输出的字符不正确地输出到控制台,它不能作为别的东西处理 –

+2

请不要考虑它作为答案,但我认为 是浏览器无法显示的字符,并且通过复制实际上您复制另一个字符的字符,所以当您使用它时,结果不是您想象的那样! – undone

+0

“~~”的工作原理是两个NOTS将字符串恢复到其原始值。或者换句话说(x == ~~ x)永远是真的。 –

回答

2

发生这种情况是因为您看到的字符有无效的(不存在的)代码。

例如H代码是72~72-73

只要它不是有效的char并且不能显示 - 它会显示为带问号的正方形。因此,它不能被翻译回来,因为你不能复制字符代码为-73(或者更精确地说 - 你的记事本或OS不能这样做)

1

的Ascii H为0100 1000或字符72〜H为1011 0111或字符183.这超出了128的基本Ascii表。

鉴于PHP并未规定字符串的特定编码,所生成的字符将取决于脚本的代码页。

这可能是不可打印的字符(因此用represented表示),当您复制/粘贴时,它们仅由符号replaced替换。

请参阅Php Strings了解字符串作为字节数组实现的更多细节。

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 

?是什么呼应对我来说,因为它们是不可打印。