2016-11-13 4 views
-2

私が持っているコード:なぜハッシュ結果は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を理解していないので、私は最も重要な理由は、あなたが何をするかutf8::downgrade理解していないということです

+3

あなたは 'map'とUTF-8エンコーディングを誤解しています。 'map'は、元のリストのすべての要素に同じ規則を適用することによって、あるリストを別のリストに変換するためのツールです。リストの各要素の出力や、返されたリストの破棄などの副作用に使用するべきではありません。それで 'map {print Digest :: SHA :: hmac_sha256_hex($ _)、" \ n "} @ list'はおそらく' print Digest :: SHA :: hmac_sha256_hex($ _) '、\ n "for @ list" 。 – Borodin

+1

引数がASCIIで表現できない場合、 'utf8 :: downgrade()'は失敗することに注意してください。だから、キリル文字には失敗します。また、 'Digest :: SHA :: hmac_sha256_hex()'はバイトとして引数を必要とするため、ワイド文字では失敗します。 –

+0

@HåkonHæglandStrangeですが、 'utf8 :: downgrade()'はあなたが見るようにキリル文字では失敗しません。 –

答えて

3

をお願いします。 utf8 utility functions

を見てみましょうあなたのコードの先頭に代わって

use strict; 
use warnings 'all'; 

を持っていた場合、あなたはサブルーチンエントリに

をメッセージ

ワイド文字を見ているだろう

行の場合

utf8::downgrade($tmp = $x) 

ドキュメントは、インプレースについてutf8::downgrade

変換し、UTF-8からネイティブのエンコード(ラテン-1やEBCDIC)の等価オクテット配列と文字列の内部表現

を教えてくれる

文字列はфで始まり、Unicode U+0444またはCYRILLIC SMALL LETTER EFです。 Latin-1またはEBCDICには同等のものはないので、コードでは処理できないエラーが生成されます

あなたは何をしようとしているのかは言いませんが、 Encodeモジュールは、最も一般的な文字エンコーディングの間で変換します

+0

perlは文字列が文字で、八重奏ではないことをどのように知っていますか? –

+1

@EugenKonkov:文字列の各バイトを個々の文字として扱うか、UTF-8でエンコードされたマルチバイト文字の一部として扱うかを指定する内部フラグがあります。正しいことを内部的に行うためにperlを残し、すべての入力と出力が正しくデコードされてエンコードされていることを確認する必要があります。マルチバイトエンコーディングの個々のバイトを処理する必要があることは非常にまれです。 – Borodin

+0

ああ。 'utf8 :: downgrade'のために知っていますが、XSのために私のコード行を報告しています。私は自分のロケールではなくutf8のシンボルを試してください。 –

関連する問題