2013-06-25 3 views
-1

많은 소스를 읽었지 만 계산 방법에 대해서는 여전히 혼란 스럽습니다. 내가 묻는 운동하고 있어요 : (16 진수로 표시) 다음과 같은 비트 시퀀스의16 진 코드를 2 진 코드로 변환하는 방법은 무엇입니까?

가 유효 UFT-8 문자열을 대표하고 경우에 그들은 코드가 수행 얼마나 많은 유효한 UTF-8 문자열입니다 비트 시퀀스는?

0x30c0 
0x303C 
0xE0ADAA 
0x3AA 
+2

무엇이 당신을 혼란스럽게합니까? 16 진수를 2 진수로 변환하거나 UTF-8이 어떻게 작동합니까? – Joni

+0

0x303c와 같이 번역하는 방법에 혼란 스럽습니다. –

+0

C가 1100으로 변환 된 다음 3이 11이 고, 그러면 0이 0이고 x가 1011입니다. 왜 대답이 11000000111100 이니? Joni –

답변

2

먼저 하나 개의 정의 : UTF-8 인코딩 1~6 바이트 순서로 유니 코드 코드 포인트.

0x30C0은 2 바이트를 나타 내기 위해 16 진수 표기법을 사용합니다. 바이트 순서에서 상위 바이트가 처음에 나타나는 것으로 가정하면 0x30에 이어 0xC0이옵니다. 당신은 파이썬 3에서이를 작성할 수 있습니다

>>> seq = b"\x30\xC0" 
>>> seq 
b'0\xc0' 

바이트의 UTF-8로 인코딩 된 스트림 수 가정 할 때, 우리는 decode 방법을 시도 할 수 :

>>> seq.decode("UTF-8") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 1: invalid start byte 

을 ??? 작동하지 않습니다. 시퀀스가 적절한 UTF-8이 아닙니다.


다음 순서에 대해 동일한 작업을 수행 할 수 있습니다

>>> seq = b"\x30\x3C" 
>>> seq.decode("UTF-8") 
'0<' 

아, 아! 예외 없음. 이것은 2 코드 포인트 0<의 문자열에 해당하는 적절한 UTF-8입니다.


세 번째는 흥미 롭다 :

>>> seq = b"\xE0\xAD\xAA" 
>>> seq.decode("UTF-8") 
'୪' 
>>> len(seq.decode("UTF-8")) 
1 

이들 3 바이트는 하나의 코드 포인트를 인코딩하는 데 사용됩니다. 하지만 어떤 캐릭터 ... 콧노래 ... "코드 포인트"는 이것입니까?

>>> ord(seq.decode("UTF-8")) 
2922 

코드 포인트 2922 (10 진수) : 파이썬은 그것을 알 수있는 ord 기능이 있습니다. 즉 ... 진수에

>>> "{:04X}".format(ord(seq.decode("UTF-8"))) 
'0B6A' 

그래서 UTF-8 유니 코드 코드 포인트 U+0B6A으로 바이트 0xE0 0xAD 0xAA 인코딩의 순서. 그러나 어떤 성격 이죠? 그래서이

>>> import unicodedata 
>>> unicodedata.name(seq.decode("UTF-8")) 
'ORIYA DIGIT FOUR' 

:이 digit 4 in Oriya writing system에 해당하는 코드 포인트입니다 파이썬은 유니 코드 데이터베이스를 조회 할 수있는 모듈을 포함.

+0

감사합니다 sylvain;) –

+0

@ErikaSawajiri 유니 코드 문자의 코드 포인트를 추출하는 방법과 문자에 해당하는 공식 이름을 갖기 위해 유니 코드 데이터베이스를 쿼리하는 방법을 보여주는 답. –

+0

실뱅 감사합니다. ~ –

1

매우 심하게 제기됩니다. 그것들은 숫자가 아닌 문자열입니다. 내가 바이트 시퀀스를 나타내는 의미가 있다고 의심,이 경우 그들은으로 작성해야 :

0x30 0xc0 
0x30 0x3C 
0xE0 0xAD 0xAA 
0x03 0xAA 

... 또는 그런 일.

그 (불분명) 질문 수단은, 다음이 무효 UTF-8있는 사람 사소한 검사를 통해서 볼 수있는 사실의 경우

  • 첫 번째는 유효하지 않습니다. 0xc0 바이트는 절대 유효한 UTF-8이 아닙니다.
  • 두 번째 것은 ASCII 만 포함하므로 정의 상 UTF-8도 유효합니다.
  • 세 번째 것은 올바른 모양 (첫 번째 바이트는 0xc1보다 크고 두 번째와 세 번째는 0x80과 0xbf 사이)입니다. UTF-8의 정의에 따라 펜과 종이로 디코딩하고 그것이 유효한지 확인할 수 있습니다.
  • 네 번째 것은 유효하지 않습니다. 멀티 바이트 시퀀스의 유효한 첫 번째 바이트가없는 연속 바이트 0xaa이 있습니다.

또는, 당신은 단지 컴퓨터를 디코딩 할 수 있도록 시도 할 수 있으며, 유효하지 않은 사람을 위해 당신에게 오류를 줄 것이다. 예를 들어, Python 버전 3을 사용하는 경우

>>> bytes([0x30,0xc0]).decode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 1: invalid start byte 
>>> bytes([0x30,0x3c]).decode('utf-8') 
'0<' 
>>> bytes([0xe0,0xad,0xaa]).decode('utf-8') 
'୪' 
>>> bytes([0x03,0xaa]).decode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 1: invalid start byte 
>>> 
+0

나는 그것을 편집했다! 정말 고맙습니다 ;) –

관련 문제