텍스트가 포함 된 바이너리 파일이 있습니다. 문자열의 16 진수 바이트를 가져 와서 읽을 수있는 텍스트로 변환해야합니다. 저는 Python 3을 사용하고 있습니다.
인코딩은 UTF-8로 보이지만 특정 문자열을 디코딩하는 데 문제가 있습니다. 일부 문자열에는 문자를 나타내는 유니 코드 코드 포인트가있는 것처럼 보이지만 다른 문자열은 UTF-8 문자 테이블의 항목에 해당하는 16 진수 값을 사용합니다. 예를 들면 다음과 같습니다.
4D 6F 6A 65 20 53 70 6F 72 65 20 76 FD 74 76 6F 72 79 -> Moje Spore výtvory
FD
해당 문자열 의 바이트는 ý
문자를 나타내지 만 FD는 다음과 같이 문자 테이블에서 유니 코드 코드 포인트를 확인하는 경우에만이 문자에 해당합니다.
이 문자를 16 진수로 나타내려면 2 바이트가 필요합니다. 모든 문자열이 이와 같이 작동하면 문제가되지 않지만 일부는 실제로 16 진수 값을 사용하여 여기에 표시된대로 문자를 나타냅니다.
4C 45 47 4F C2 AE -> LEGO®
이 예에서 2 바이트 C2 AE
는 ®
문자를 나타냅니다 . 그러나 이것은 여기에 표시된 유니 코드 코드 포인트가 아니라 16 진수 표현입니다.
이제 여기에 문제가 있습니다. 문자열이 언제 유니 코드 코드 포인트를 사용하는지, 언제 16 진수 값을 사용하는지 알 수있는 방법이 없으며 완벽하게 구문 분석해야합니다. 왜 이것이 사실 일 수 있는지에 대한 아이디어가 있습니까? UTF-8로 이것을 디코딩하려고하면 파이썬이 충돌합니다.. 같은 값에 도달하면 FD
무엇을해야할지 모르기 때문입니다. ord()
및 chr()
함수를 사용하여 바이트 단위로 디코딩하려고 시도했지만 충돌을 방지하는 동안 멀티 바이트 문자가 속하지 않는 추가 항목을 갖게됩니다 (예 : LEGO 예제는 다음과 같습니다 :) LEGO®
. 데이터는 체크섬을 생성하는 데 사용되어야하기 때문에 완벽하게 구문 분석되어야하므로 보이지 않는 항목도 결과를 변경할 수 있습니다. 감사.
첫 번째 문자열 (FD 포함)은 UTF-8로 인코딩 되지 않습니다 . ISO-8859-1 또는 Windows-1252 일 가능성이 높습니다. 나타내는 바이트는 ý
유니 코드 코드 포인트 값과 일치하지만 "[U] nicode 코드 포인트를 사용하여 문자를 표시"하지 않습니다.
LEGO 문자열은 UTF-8로 인코딩됩니다. 파일에서 문자열을 해킹하고 사양이없는 경우 추측 만하면됩니다. UTF-8은 멀티 바이트 인코딩에 대한 특정 규칙을 따라야하므로 UTF-8을 먼저 시도하고 UTF-8이 아닌 경우 디코딩이 실패 할 수 있습니다. 그런 다음 ISO-8859-1
. 후자는 인코딩이 아니더라도 모든 것을 디코딩합니다. 쓰레기로 끝날 수 있습니다.
UTF-8 인코딩의 예 :
>>> s='Moje Spore výtvory'.encode('utf8')
>>> s
b'Moje Spore v\xc3\xbdtvory'
>>> s.hex()
'4d6f6a652053706f72652076c3bd74766f7279'
>>> s.decode('utf8')
'Moje Spore výtvory'
>>> s.decode('iso-8859-1') # note it works, but garbage
'Moje Spore výtvory'
문자열이 ISO-8859-1로 인코딩 된 경우 :
>>> s='Moje Spore výtvory'.encode('latin1') # an alias for ISO-8859-1
>>> s.hex()
'4d6f6a652053706f72652076fd74766f7279'
>>> s.decode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 12: invalid start byte
>>> s.decode('latin1')
'Moje Spore výtvory'
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다