2011-09-28 44 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 

?是什麼呼應對我來說,因爲它們是不可打印。