파이썬 코딩의 기술 batter_way03입니다. 앞으로 batter_way90을 공부할 때까지 블로그 포스팅을 진행할 것입니다.
부호가 없는 8바이트 데이터 들어감.
아스크 인코딩을 활용하여 내부 문자 표시
a = b'h\x65llo'
print (list (a ) )
print (a)
#[104,101,108,108,111]
b'hello'
대응하는 텍스트 인코딩 없음
decode메서드: 이진 데이터를 유니코드로 변환
사람이 사용하는 언어의 문자 표현
유니코드 코드 포인트가 있음
a = 'a\u0300 propos'
print(list(a))
print(a)
직접 대응하는 이진 인코딩이 없음
encode메서드: 유니코드 데이터를 이진 데이터로 변환
프로그램의 핵심부분에서 사용
다양한 텍스트 인코딩을 입력으로 받음
출력 텍스트 인코등은 한 가지로 제한.(보통 UTF-8)
유니코드 샌드위치
유니코드 데이터 인코딩 혹은 디코딩 부분
인터페이스의 가장 먼 경계 지점에 위치 시키기
UTF- 8(또는 다른 인코딩 방식)로 인코딩된 8비트 시퀀스를 그대로 시용하고 싶다.
특정 인코딩을 지정하지 않은 유니코드 문자열을 사용-하고 싶다.
두 경우를 변환해주고 입력 값이 코드가 원하는 값과 일치시키기
첫 번째 함수는 bytes나 str인스턴스를 받아서 항상 str반환
def to_str(bytes_or_str):
if isinstance(bytes_or_str, bytes):
value = bytes_or_str.decode('utf-8')
else:
value = bytes_or_str
return value #str 인스턴스
print(repr(to_str(b'foo')))#'foo'
print(repr(to_str('bar'))) #'bar'
print(repr(to_str(b'\xed\x95\x9c'))) # '한' :UTF-8에서 한글은 3바이트
def to_bytes(bytes_or_str):
if isinstance(bytes_or_str, str):
value = bytes_or_str.encode('utf-8')
else:
value = bytes_or_str
return value #bytes 인스턴스
print(repr(to_bytes(b'foo')))#b'foo'
print(repr(to_bytes('bar')))#b'bar'
print(repr(to_bytes('한글')))#b'\xed\x95\x9c\x ea\xb8\x80 '
#str형식화 문자열에 bytes인스턴스를 넘길 수 있다.
print('red %s' %b'blue')
#그대로 b'blue'가 남기에 깔끔해보이진 않는다
#내장 함수인 open을 호출해서 얻은 파일 핸들과 관련한 연산
# 디폴트로 유니코드 문자열을 요구하고 이진 바이트 문자열을 요구 X ->코드 실행 X
with open('data.bin', 'w') as f:
f.write(b'\xf1\xf2\xf3\xf4\xf5')
#에러 이유: 텍스트 쓰기 모드(w)로 열어서이다.
#텍스트 모드: 유니코드 데이터가 들어있는 str인스턴스 요구
#파일을 열 때 이진 쓰기 모든(wb)로 열면 해결
with open('data.bin', 'wb') as f:
f.write(b'\xf1\xf2\xf3\xf4\xf5')
#다른 방식 해결
#open함수의 encoding 파라미터를 명시하면 플랫폼이 따라서 달라진다.
with open('data.bin', 'r', encoding='cp1252') as f:
data = f.read()
assert data == 'fio665'