많은 소스를 읽었지 만 계산 방법에 대해서는 여전히 혼란 스럽습니다. 내가 묻는 운동하고 있어요 : (16 진수로 표시) 다음과 같은 비트 시퀀스의16 진 코드를 2 진 코드로 변환하는 방법은 무엇입니까?
가 유효 UFT-8 문자열을 대표하고 경우에 그들은 코드가 수행 얼마나 많은 유효한 UTF-8 문자열입니다 비트 시퀀스는?
0x30c0 0x303C 0xE0ADAA 0x3AA
많은 소스를 읽었지 만 계산 방법에 대해서는 여전히 혼란 스럽습니다. 내가 묻는 운동하고 있어요 : (16 진수로 표시) 다음과 같은 비트 시퀀스의16 진 코드를 2 진 코드로 변환하는 방법은 무엇입니까?
가 유효 UFT-8 문자열을 대표하고 경우에 그들은 코드가 수행 얼마나 많은 유효한 UTF-8 문자열입니다 비트 시퀀스는?
0x30c0 0x303C 0xE0ADAA 0x3AA
먼저 하나 개의 정의 : 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에 해당하는 코드 포인트입니다 파이썬은 유니 코드 데이터베이스를 조회 할 수있는 모듈을 포함.
감사합니다 sylvain;) –
@ErikaSawajiri 유니 코드 문자의 코드 포인트를 추출하는 방법과 문자에 해당하는 공식 이름을 갖기 위해 유니 코드 데이터베이스를 쿼리하는 방법을 보여주는 답. –
실뱅 감사합니다. ~ –
매우 심하게 제기됩니다. 그것들은 숫자가 아닌 문자열입니다. 내가 바이트 시퀀스를 나타내는 의미가 있다고 의심,이 경우 그들은으로 작성해야 :
0x30 0xc0
0x30 0x3C
0xE0 0xAD 0xAA
0x03 0xAA
... 또는 그런 일.
그 (불분명) 질문 수단은, 다음이 무효 UTF-8있는 사람 사소한 검사를 통해서 볼 수있는 사실의 경우
0xc0
바이트는 절대 유효한 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
>>>
나는 그것을 편집했다! 정말 고맙습니다 ;) –
무엇이 당신을 혼란스럽게합니까? 16 진수를 2 진수로 변환하거나 UTF-8이 어떻게 작동합니까? – Joni
0x303c와 같이 번역하는 방법에 혼란 스럽습니다. –
C가 1100으로 변환 된 다음 3이 11이 고, 그러면 0이 0이고 x가 1011입니다. 왜 대답이 11000000111100 이니? Joni –