[파이선2] 파이선2의 한글 인코딩 비교하기

2015. 1. 12. 16:35·python

<파이선 2의 한글 인코딩?

 

파이선2는 처음부터 유니코드를 지원하지 않았다가,
버전업이 되면서 지원을 시작해서 그런지, 한글을 사용하게 되면 인코딩에 문제가 발생한다.


우선 파이선 파일 내부에서 한글을 사용하기 위해서는
다음의 힌트를 소스코드 첫번째 또는 두번째 라인에 입력해야 한다.

 

 # -*- coding: utf-8 -*-

 

그렇지 않으면 파이선2는 기본적으로 ascii 인코딩을 사용하기 때문에 다음의 오류가 발생한다.

 

SyntaxError: Non-ASCII character '\xec' in file 

 

이렇게 오류가 발생하면 힌트를 입력해 주도록 하자.

 

 

 # -*- coding: utf-8 -*-

# str, unicode 형태에 대한 선언
h1 = '한글'
h2 = u'한글'

 

# 출력
print h1
print h2

>> 한글
>> 한글

 

# 서로다른 타입에 대한 확인
print type(h1)
print type(h2)

>> <type 'str'>
>> <type 'unicode'>

 

# 리스트에 추가후 출력
str_list = []
str_list.append(h1)
str_list.append(h2)
print str_list

>> ['\xed\x95\x9c\xea\xb8\x80', u'\ud55c\uae00']

 

'''
# UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 오류 발생
if h1 == h2:
    print True
'''

 

'''
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 0: ordinal not in range(128)
if h1.encode('utf-8') == h2:
    print True
'''

 

str_list.append(h2.encode('utf-8'))
str_list.append(h1.decode('utf-8'))
print str_list

>> ['\xed\x95\x9c\xea\xb8\x80', u'\ud55c\uae00', '\xed\x95\x9c\xea\xb8\x80', u'\ud55c\uae00']

 

if h1 == h2.encode('utf-8'):
    print True
else:
    print False


if h1.decode('utf-8') == h2:
    print True
else:
    print False


위와 같이 테스트를 해보면 파이선2는 str 타입과 unicode 타입이 따로 있음을 알 수 있다.

그리고 print 문에서는 알아서 형식을 바꿔서 출력해주지만,
리스트에 저장된 형식을 보면 str 과 unicode 는 저장된 형식이 다름을 알 수 있다.

 

문자열 형식을 비교할때도 str 과 unicode 형식을 바로 비교하면 다음의 오류가 발생한다.

 

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 


그리고 ascii 형태의 문자열을 utf-8 로 인코딩 하려고 하면 다음의 오류가 발생한다.

UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 0: ordinal not in range(128) 

 

비교연산은 위와 같이 유니코드 데이터를 utf-8 형식으로 인코딩 하던지, ascii 형태의 문자열을 utf-8로 디코드 해서 비교하면 된다.

 

리스트에 저장된 형식을 보면 알 수 있지만, 유니코드 형식의 한글을 utf-8 로 인코딩하면 ascii 형식으로 저장이 되고
ascii 형식의 한글을 utf-8로 디코드하면 유니코드 형식으로 저장이 된다.

 

 

 

* decode, encode 시에 'error' 파라미터를 지정할 수 있다.

 

# illegal multibyte sequence 오류 발생시 아래와 같이 입력

h2.encode('utf-8', 'replace'); 

h2.encode('utf-8', 'ignore');


위와 같이 파라미터를 입력하여 문자열 변환시 변환할 수 없는 문자열이 발생했을 때

해당 문자를 무시하고 지나갈지, 강제로 변환시킬지 지정할 수 있다.

 

The errors argument specifies the response when the input string can’t be converted according to the encoding’s rules. Legal values for this argument are ‘strict’ (raise a UnicodeDecodeError exception), ‘replace’ (add U+FFFD, ‘REPLACEMENT CHARACTER’), or ‘ignore’ (just leave the character out of the Unicode result). The following examples show the differences: 

 


반응형
저작자표시 비영리 (새창열림)

'python' 카테고리의 다른 글

[python] subprocess 모듈을 이용한 명령어 실행  (1) 2015.06.11
파이썬의 중요 특징(클로저함수, 장식자, 생성기, 코루틴)  (0) 2015.02.09
[python][xlswriter] xlsxwriter 의 메모리 점유해제를 위한 constant_memory 모드 설정  (0) 2015.02.04
Python 에 한글 입력하기  (0) 2015.01.09
문자열 포맷팅  (0) 2014.12.24
'python' 카테고리의 다른 글
  • 파이썬의 중요 특징(클로저함수, 장식자, 생성기, 코루틴)
  • [python][xlswriter] xlsxwriter 의 메모리 점유해제를 위한 constant_memory 모드 설정
  • Python 에 한글 입력하기
  • 문자열 포맷팅
hs_seo
hs_seo
Hello World!
    반응형
  • hs_seo
    개발자로 살아남기
    hs_seo
  • 전체
    오늘
    어제
    • 전체 (1140)
      • 개발자 (21)
        • 개발에 유의할 점 (0)
        • 면접 (5)
      • IT 소식 (5)
        • 업계 (1)
      • java (51)
        • 디자인패턴 (3)
        • apache-common (1)
      • 개념 (47)
        • 자료구조 (4)
        • 함수형사고 (8)
        • 디자인패턴 (1)
      • 데이터분석 (1)
      • python (67)
        • 코드조각 (12)
        • 라이브러리 (2)
      • 빅데이터 (418)
        • zookeeper (5)
        • hadoop (78)
        • hdfs (12)
        • hive (127)
        • hbase (16)
        • spark (40)
        • scala (4)
        • trino (3)
        • oozie (41)
        • Hue (9)
        • R (5)
        • sqoop (6)
        • flume (3)
        • elasticsearch (2)
        • airflow (16)
        • kafka (3)
        • kubernetes (10)
        • openstack (3)
        • flink (2)
        • redis (2)
      • 빅데이터 강좌 (2)
      • 알고리즘 (131)
        • 알고리즘 (1)
        • 백준 (61)
        • 정올 (41)
        • 더블릿 (5)
        • 프로그래머스 (1)
      • 프로그래밍 언어 (30)
        • go (4)
        • js (9)
        • .Net (6)
        • Jsp (1)
        • ansible (3)
        • terraform (6)
      • Tools (56)
        • docker (2)
        • macbook (6)
        • maven (3)
        • sublime (1)
      • 프레임워크 (25)
        • [JS] angularjs (2)
        • [JS] node.js (19)
        • [Java] spring (2)
        • Android (2)
      • 데이타베이스 (43)
        • SQLD (5)
        • Oracle (1)
        • MySQL (8)
        • ADsP (2)
      • 리눅스 (25)
        • Bash (61)
      • GCP (5)
      • AWS (34)
        • EC2 (2)
        • EMR (14)
      • 정보보안기사 (4)
        • 네트워크 (1)
      • 개인 (80)
        • 업무실수 (0)
        • 책 (9)
        • 교육 (3)
        • 여행 (17)
        • 영화 (12)
        • 음악 (2)
        • 피규어 (4)
        • 게임 (3)
        • 생각 (7)
        • 기타 (10)
        • 좋은글 (5)
        • 좋은 사이트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 빅데이터-하둡,하이브로 시작하기
    • 빅데이터-스칼라, 스파크로 시작하기
    • Kaggle에서 파이썬으로 데이터 분석 시작하기
    • 쉘스크립트 개발 시작하기
    • 개발자가 데이터 분석 준전문가 되기
    • 데브쿠마
  • 공지사항

  • 인기 글

  • 태그

    Tez
    하이브
    emr
    bash
    ubuntu
    다이나믹
    HIVE
    정올
    하둡
    k8s
    HDFS
    알고리즘
    java
    mysql
    백준
    nodejs
    Python
    airflow
    오류
    SPARK
    hbase
    Linux
    oozie
    yarn
    S3
    AWS
    error
    build
    파이썬
    Hadoop
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hs_seo
[파이선2] 파이선2의 한글 인코딩 비교하기
상단으로

티스토리툴바