ordinal not in range(128)
??
499, 502, ordinal not in range(128)
?????
뭔 소리여
오류의 이유
- 실행파일을 만들었다 : 오류가 났다.
이유는 pyinstaller는
python 3 이상 버전으로 실행파일이 만들어져서
인코딩(utf와 같은)이 필요없는 반면에
linux버전은 2.x에 설치된 cxfreeze라는 것으로
실행파일을 만들어서
python 2.x버전으로 실행파일이 만들어졌어요,
파이썬은 본래 아스키코드 기반으로 된 언어.
python 2.x버전엔 언어처리가 제대로 되어있지 않았음.
유니코드화 해주는 별도 전처리 작업을 따로 해주어야 된다고 함
python 3.x 이하 버전의 경우
소스 코드 제일 상단에 다음과 같은 인코딩 명시 문장을 넣어줍니다.
- 'utf-8일 경우'
(파이썬 3.0 부터는 utf-8이 디폴트라서 인코딩된 소스 코드의 경우 경우 아래 문장을 생략가능)
# -*- coding: utf-8 -*-
- 'euc-kr 일 경우'
# -*- coding: euc-kr -*-
만약 소스코드는 euc-kr로 인코딩되었는데 파일상단에는
utf-8로 명시되어져 있다면
문자열 처리하는 부분에서 인코딩 관련한 오류가 발생할 수 있음
ㅡ_ㅡ
여기서 멘붕...
만능이 아니에효
utf-8로 소스코드가 인코딩 되었다는 가정 하에 움직이기 때문에...
외부 라이브러리 만든 사람이 utf-8로 명시하지 않았다면
깨지거나 버그가 일어납니다
.
.
.
python 에서 한글 사용?
특히 2.x 버전 !!!!
python에서 한글 출력하면 SyntacError나타남.
그래서 위와 같은 처리를 통해 인코딩 해결방식으로 해결을 해줌.
부분부분 해결해주는 방법도 있습니다.
str - unicode 변환
s = 'english' print str(unicode(s))
위와 같이 영어 문자열을 Unicode로 꾸었다가 str로 바꾸는 코드
많이들 보신 코드들
print str(unicode("문자열")
근데 이 코드 한글은 안됨
왜냐면 한글을 아스키 코드라고 간주하고 유니코드변환, 해석 시도를 하니 그렇지
해결방법?
이를 해결하기 위해서는 아래의 소스와 같이
명시적으로 문자열을 utf-8로 간주하고 unicode로 변환하도록 풀어풀어풀어줘야 합니다
# -*- coding: utf-8 -*-
str = '문자열'
print str.decode('utf-8').encode('utf-8')
그런데 위 가정은
외부 라이브러리를 만든 사람이 문자열을 유니코드로,
유니코드를 문자열로 변환할때 인코딩을 명시적으로 적지 않앗다고 가정,
외부 라이브러리를 우리가 가져다 사용하는데 함수의 인자로 한글을 사용하게 된다면
UnicodeDecodeError 이 발생한다(이런경우 허다함)
예전엔 인코딩/디코딩 지점에 전부 인코딩을 명시적으로 적어주곤 했는데
소스가 길어지면 ...아니라고 봅니다
만약 Unicode로 인코딩/디코딩 할 때 사용할 기본 인코딩을 아스키대신 utf-8로 바꿔주면
쉽게 해결할 수 있지 않을까?
sys.setdefaultencodeing이 이럴때 사용하는 함수!
기본 인코딩을 ascii대신 utf-8로 바꿔주는 내용
# -*- coding: utf-8 -*- 이 부분과 달리 저건 함수라서 호출 된 이후 계속 유지 됨.
적절한 곳에 한번만 넣어주면 끝.
참고로 'reload(sys)'를 해주지 않으면 sys.setdefaultencodeing 기능을 사용할 수 없으므로 참고하시길!
ordinal not in range(128)
??
499, 502, ordinal not in range(128)
?????
뭔 소리여
오류의 이유
- 실행파일을 만들었다 : 오류가 났다.
이유는 pyinstaller는
python 3 이상 버전으로 실행파일이 만들어져서
인코딩(utf와 같은)이 필요없는 반면에
linux버전은 2.x에 설치된 cxfreeze라는 것으로
실행파일을 만들어서
python 2.x버전으로 실행파일이 만들어졌어요,
파이썬은 본래 아스키코드 기반으로 된 언어.
python 2.x버전엔 언어처리가 제대로 되어있지 않았음.
유니코드화 해주는 별도 전처리 작업을 따로 해주어야 된다고 함
python 3.x 이하 버전의 경우
소스 코드 제일 상단에 다음과 같은 인코딩 명시 문장을 넣어줍니다.
- 'utf-8일 경우'
(파이썬 3.0 부터는 utf-8이 디폴트라서 인코딩된 소스 코드의 경우 경우 아래 문장을 생략가능)
# -*- coding: utf-8 -*-
- 'euc-kr 일 경우'
# -*- coding: euc-kr -*-
만약 소스코드는 euc-kr로 인코딩되었는데 파일상단에는
utf-8로 명시되어져 있다면
문자열 처리하는 부분에서 인코딩 관련한 오류가 발생할 수 있음
ㅡ_ㅡ
여기서 멘붕...
만능이 아니에효
utf-8로 소스코드가 인코딩 되었다는 가정 하에 움직이기 때문에...
외부 라이브러리 만든 사람이 utf-8로 명시하지 않았다면
깨지거나 버그가 일어납니다
.
.
.
python 에서 한글 사용?
특히 2.x 버전 !!!!
python에서 한글 출력하면 SyntacError나타남.
그래서 위와 같은 처리를 통해 인코딩 해결방식으로 해결을 해줌.
부분부분 해결해주는 방법도 있습니다.
str - unicode 변환
s = 'english' print str(unicode(s))
위와 같이 영어 문자열을 Unicode로 꾸었다가 str로 바꾸는 코드
많이들 보신 코드들
print str(unicode("문자열")
근데 이 코드 한글은 안됨
왜냐면 한글을 아스키 코드라고 간주하고 유니코드변환, 해석 시도를 하니 그렇지
해결방법?
이를 해결하기 위해서는 아래의 소스와 같이
명시적으로 문자열을 utf-8로 간주하고 unicode로 변환하도록 풀어풀어풀어줘야 합니다
# -*- coding: utf-8 -*- str = '문자열' print str.decode('utf-8').encode('utf-8')
그런데 위 가정은
외부 라이브러리를 만든 사람이 문자열을 유니코드로,
유니코드를 문자열로 변환할때 인코딩을 명시적으로 적지 않앗다고 가정,
외부 라이브러리를 우리가 가져다 사용하는데 함수의 인자로 한글을 사용하게 된다면
UnicodeDecodeError 이 발생한다(이런경우 허다함)
예전엔 인코딩/디코딩 지점에 전부 인코딩을 명시적으로 적어주곤 했는데
소스가 길어지면 ...아니라고 봅니다
만약 Unicode로 인코딩/디코딩 할 때 사용할 기본 인코딩을 아스키대신 utf-8로 바꿔주면
쉽게 해결할 수 있지 않을까?
sys.setdefaultencodeing이 이럴때 사용하는 함수!
# -*- coding: utf-8 -*- 이 부분과 달리 저건 함수라서 호출 된 이후 계속 유지 됨.
적절한 곳에 한번만 넣어주면 끝.
참고로 'reload(sys)'를 해주지 않으면 sys.setdefaultencodeing 기능을 사용할 수 없으므로 참고하시길!
출처 - https://libsora.so/posts/python-hangul/
'개발일기 > 파이썬' 카테고리의 다른 글
[python3.x/django/버그] JSONDecodeError , JSON디코드 버그 (별거아님 엄청 짧음) (0) | 2021.04.13 |
---|---|
python 딕셔너리(dict) 정렬(sorted), 역순정렬 (0) | 2020.07.06 |
[python3.7] Kakao Rest API 사용해서 주소 좌표 변환 하기 (카카오 401에러처리) (0) | 2020.03.26 |
[python3.7/centos7/버그] No such file or directory: '/usr/lib/jvm' : 파이썬에 가져다 쓸 jdk가 없다고 한다. (0) | 2020.03.17 |
python 자주 사용하는 elasticsearch query 모음 (1) (0) | 2020.01.20 |