Python UnicodeDecodeError-인코딩을 오해하고 있습니까?
이것이 작동하지 않는 이유에 대한 생각이 있습니까? 나는 정말로 '무시'가 옳은 일을 할 것이라고 생각했습니다.
>>> 'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)
… "인코딩"이라고 불리는 이유가 있습니다…
약간의 서문 : 유니 코드를 표준 또는 이상적인 상태로 생각하십시오. 유니 코드는 문자 표일뿐입니다. №65는 라틴 수도 A입니다. №937은 그리스 수도 오메가입니다. 그냥.
컴퓨터가 유니 코드를 저장 및 / 또는 조작 하려면 이를 바이트 로 인코딩 해야합니다. 유니 코드 의 가장 간단한 인코딩 은 UCS-4입니다. 모든 문자는 4 바이트를 차지하며 ~ 1000000 문자를 모두 사용할 수 있습니다. 4 바이트에는 유니 코드 테이블의 문자 수가 4 바이트 정수로 포함됩니다. 또 다른 매우 유용한 인코딩은 UTF-8로, 1-4 바이트의 모든 유니 코드 문자를 인코딩 할 수 있습니다. 그러나 "latin1"과 같은 일부 제한된 인코딩도 있습니다. 여기에는 매우 제한된 범위의 문자가 포함되며 주로 서구 국가에서 사용됩니다. 이러한 인코딩 은 문자 당 1 바이트 만 사용합니다.
기본적으로 유니 코드는 많은 인코딩으로 인코딩 될 수 있으며 인코딩 된 문자열은 유니 코드 로 디코딩 될 수 있습니다 . 문제는 유니 코드가 꽤 늦게 나왔기 때문에 8 비트 문자 집합을 사용하여 자란 우리 모두는 너무 늦게 배웠기 때문에 이번에는 인코딩 된 문자열로 작업했습니다 . 인코딩은 시스템 기본값에 따라 ISO8859-1, Windows CP437, CP850, 또는 또는 또는, 또는, 또는, 또는, 또는, 또는 ISO8859-1 일 수 있습니다.
따라서 소스 코드에서 "add"Monitoring "to list"문자열을 입력하면 (그리고 "add"Monitoring "to list"문자열을 원한다고 생각합니다. 두 번째 따옴표에 유의하십시오) 실제로 이미 문자열을 사용하고있는 것입니다. 시스템의 기본 코드 페이지에 따라 인코딩 됩니다 (\ x93 바이트 단위로 Windows 코드 페이지 1252, "Western"을 사용한다고 가정합니다). 여기서 유니 코드를 얻으려면 "cp1252"인코딩에서 문자열 을 디코딩 해야합니다 .
그래서, 당신이 의도 한 것은 :
"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")
불행히도 Python 2.x에는 .encode
문자열에 대한 메서드가 포함되어 있습니다. 이것은 "zip", "rot13"또는 "base64"와 같은 "특수"인코딩을위한 편의 기능으로, 유니 코드와는 관련이 없습니다.
어쨌든, 이리저리 유니 코드 변환에 대해 기억해야 할 것은 다음과 같습니다.
- 유니 코드 문자열은 Python 2.x 문자열 (실제로는 일련의 바이트)로 인코딩 됩니다.
- Python 2.x 문자열이 유니 코드 문자열로 디코딩 됩니다.
두 경우 모두 사용할 인코딩 을 지정해야합니다 .
잘 모르겠고 졸려요.하지만 제가 돕길 바래요.
추신 : 유머러스 한 사이드 노트 : 마야인들은 유니 코드를 가지고 있지 않았습니다. 고대 로마인, 고대 그리스인, 고대 이집트인도 마찬가지였습니다. 그들 모두는 그들 자신의 "인코딩"을 가지고 있었고, 다른 문화를 거의 또는 전혀 존중하지 않았습니다. 이 모든 문명은 무너져 먼지가되었습니다. 사람들을 생각해보세요! 인류의 이익을 위해 앱이 유니 코드를 인식하도록 만드세요. :)
PS2 "But the Chinese…"라고 말하면서 이전 메시지를 망치지 마십시오. 그러나 그렇게 할 의향이 있거나 의무가 있다고 생각되면 유니 코드 BMP가 대부분 중국어 표의 문자로 채워져 있다고 생각하여 지연 시키십시오. 에르고 중국어가 유니 코드의 기초입니다. 사람들이 유니 코드 인식 응용 프로그램을 개발하는 한 저는 계속해서 터무니없는 거짓말을 만들 수 있습니다. 건배!
인코딩은 유니 코드 문자열에 사용할 수 있지만 가지고있는 문자열은 유니 코드로 보이지 않습니다 (u'add \ x93Monitoring \ x93 to list ')
>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '
이것은 작동하는 것 같습니다.
'add \x93Monitoring\x93 to list '.decode('latin-1').encode('latin-1')
그에 문제가 있습니까? '무시', '바꾸기'및 기타 인코딩 오류 처리가 언제 들어오는 지 궁금합니다.
참조 URL : https://stackoverflow.com/questions/368805/python-unicodedecodeerror-am-i-misunderstanding-encode
'programing tip' 카테고리의 다른 글
Javascript-개체에서 정의되지 않은 필드 제거 (0) | 2021.01.09 |
---|---|
별도의 창에서 크롬 디버거를 열 수 있습니까? (0) | 2021.01.09 |
헤더가 그대로있는 Python을 사용하여 CSV 파일을 가져 오는 방법 (첫 번째 열이 숫자가 아닌 열임) (0) | 2021.01.09 |
다시 입력하지 않고 data.frame () 내에서 열 이동 (0) | 2021.01.09 |
CSS를 사용하여 모서리 자르기 (0) | 2021.01.09 |