2016-11-13 1 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

UTF-8 인코딩뿐만 아니라'map'도 오해하고 있습니다. '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ægland Strange이지만 utf8 :: downgrade()는 볼 수 있듯이 키릴 문자로는 실패하지 않습니다. –

답변

3

부탁드립니다. 당신은 코드의 상단에 장소에

use strict; 
use warnings 'all'; 

이 있다면 utf8 utility functions

에서 봐, 당신은 메시지

서브 루틴 항목에서 와이드 문자

를 보았을 것 라인 용

문서는 우리에게 알려줍니다에 대한 utf8::downgrade

변환 현재 위치에서 기본 인코딩에 해당하는 옥텟 시퀀스에 UTF-8에서 문자열의 내부 표현 (라틴-1 또는 EBCDIC)

문자열이 ф으로 시작됩니다. 유니 코드는 U+0444 또는 CYRILLIC SMALL LETTER EF입니다. Latin-1 또는 EBCDIC에는 해당 코드가 없으므로 코드에서 처리 할 수없는 오류가 발생합니다.

당신이하려는 일을 말하지 않지만, 당신이해야 할 일은 Encode 가장 인기있는 문자 인코딩간에 변환하는 모듈

+0

perl은 문자열이 옥텟이 아닌 문자이어야 함을 어떻게 알 수 있습니까? –

+1

@EugenKonkov : 문자열의 각 바이트를 개별 문자로 취급해야하는지 아니면 UTF-8로 인코딩 된 멀티 바이트 문자 (확장자)의 일부로 취급해야 하는지를 나타내는 내부 플래그가 있습니다. 내부적으로 올바른 일을하도록 perl을 떠나야하고 모든 입력과 출력이 올바르게 디코딩되고 인코딩되도록해야합니다. 멀티 바이트 인코딩의 개별 바이트로 작업해야하는 경우는 극히 드뭅니다. – Borodin

+0

아. 그것은'utf8 :: downgrade' 때문에 알고 있지만 XS 때문에 코드 라인을보고합니다. 내 로케일에서 utf8 기호를 시도해야합니다 –

관련 문제