본문 바로가기
개발일기/파이썬

python 2.x 반나절을 잡아먹은 인코딩 버그 ordinal not in range(128), 499 502, UnicodeEncodeError('ascii') ...

by 프로그래머콩 2020. 3. 27.

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/