我有代碼:爲ASCII爲什麼哈希結果不同,當應用UTF8功能
push my(@list), $x;
utf8::upgrade($tmp = $x); push @list, $tmp;
utf8::downgrade($tmp = $x); push @list, $tmp;
push @list, Encode::encode_utf8($x);
push @list, Encode::decode_utf8($x);
print Digest::SHA::hmac_sha256_hex($_), "\n" for @list
d9fa76e37bfe94cfcb0011cf070316775e52845021ee92d9bebe8ef289f87e16
d9fa76e37bfe94cfcb0011cf070316775e52845021ee92d9bebe8ef289f87e16
d9fa76e37bfe94cfcb0011cf070316775e52845021ee92d9bebe8ef289f87e16
d9fa76e37bfe94cfcb0011cf070316775e52845021ee92d9bebe8ef289f87e16
d9fa76e37bfe94cfcb0011cf070316775e52845021ee92d9bebe8ef289f87e16
爲什麼當$ x是фыва
第四哈希值是不同的,PROGRAMM的崩潰:
09165674df9a2eada20acb972bbf71d4cb5637b152d84568fd2e8fcbe9d61188
09165674df9a2eada20acb972bbf71d4cb5637b152d84568fd2e8fcbe9d61188
09165674df9a2eada20acb972bbf71d4cb5637b152d84568fd2e8fcbe9d61188
36cdc4291ac91e26f76a208feb90e8a5a35729d54660bbb63acdb82746f7ec6a
Wide character in subroutine entry at ./t3.pl line 7.
請給我一些關於utf8魔法的燈光。謝謝。
UPD
在應用程序,我應該通過檢查體徵檢查數據完整性。有時數據以UTF8格式顯示。在我們不處理這種情況之前。
Digest::SHA::hmac_sha256_hex(Encode::encode_utf8($data))
與此同時我檢查,如果我申請這個或那個功能,輸入的數據會是什麼:在這裏,我想檢查後簽收不會改變。
是啊,我不明白UTF8,所以我想問
您誤解了'map'和UTF-8編碼。 'map'是通過對原始列表的每個元素應用相同的規則將一個列表轉換爲另一個列表的工具。它不應該用於其副作用,如打印列表中的每個元素,特別是在丟棄返回的列表時。因此'map {print Digest :: SHA :: hmac_sha256_hex($ _),「\ n」} @ list'可能應該是'print digest :: SHA :: hmac_sha256_hex($ _),「\ n」 。 – Borodin
請注意,如果參數不能用ASCII表示,'utf8 :: downgrade()'將失敗。所以西里爾字符會失敗。另外'Digest :: SHA :: hmac_sha256_hex()'需要參數作爲字節,所以對於寬字符將會失敗。 –
@HåkonHægland奇怪的是,'utf8 :: downgrade()'不會因西里爾字符失敗,正如你所看到的。 –