I. 유니코드 문자열 클래스와 바이트 문자열 클래스
가. 문자열 클래스
- 문자열 클래스는 유니코드 문자 세트를 지원하므로, 한글이나 영어 문자열 객체 생성
- [예제] 문자열 생성
print(str("한글 문자")) print(bytes(b"En String")) # 영어 문자 세트만 사용 시 문자열 앞에 b를 붙여 바이트 문자열 명시 print("문자열 클래스만: ", set(dir(str)) - set(dir(bytes))) # 문자열 클래스에만 있는 메소드 print("바이트 클래스만: ", set(dir(bytes)) - set(dir(str))) # 바이트 클래스에만 있는 메소드 krStr = "한글문자열" print("한글문자열 유니코드 길이: ", len(krStr)) # 유니코드 문자열 길이 krBytes = krStr.encode() # 문자열을 바이트 문자열로 변환 print("한글문자열 바이트 길이: ", len(krBytes)) # 바이트 문자열 길이 [결과] 한글 문자 b'En String' 문자열 클래스만: {'format_map', 'format', 'casefold', 'isnumeric', 'isdecimal', 'encode', 'isprintable', 'isidentifier'} 바이트 클래스만: {'hex', 'fromhex', 'decode'} 한글문자열 유니코드 길이: 5 한글문자열 바이트 길이: 15 # 한글 1문자는 3byte 임을 알 수 있음
나. 변경 가능한 문자열 클래스
- 직접 변경 가능한 바이트 문자열은 bytearray 클래스로 객체를 만들어 사용
- [예제] 문자열 변경
strArr = bytearray(bytes(b'HelloWorld')) print(strArr) print(chr(strArr[5])) # 바이트 배열의 원소 조회 strArr[5] = ord('P') # 바이트 배열의 원소 변경 print(strArr) [결과] bytearray(b'HelloWorld') W bytearray(b'HelloPorld')
II. 유니코드 문자열과 바이트 문자열 인코딩
- 한글 문자열 생성 후 바이트 문자열 변환 시 encoding으로 utf-16 지정
- 변환한 바이트 문자열을 16진수 변환 시 fffe가 붙어 utf-16 처리 확인
- [예제] 유니코드 문자열 인코딩, 빅엔디언/리틀엔디언
krStr = "한글문자열" krStrEncode = krStr.encode(encoding='utf-16') print("인코드된 문자열: ", krStrEncode) print("길이: ", len(krStrEncode)) print("16진수: ", krStrEncode.hex()) krStrBE = krStr.encode(encoding='utf-16be') print("Big Endian: ", krStrBE) krStrLE = krStr.encode(encoding='utf-16le') print("Little Endian: ", krStrLE) print("비정상 디코딩: ", krStrBE.decode(encoding='utf-16le')) # BE로 인코딩 시 BE로 디코딩해야 함 print("정상 디코딩: ", krStrBE.decode(encoding='utf-16be')) [결과] 코드된 문자열: b'\xff\xfe\\\xd5\x00\xae8\xbb\x90\xc7\xf4\xc5' 길이: 12 16진수: fffe5cd500ae38bb90c7f4c5 Big Endian: b'\xd5\\\xae\x00\xbb8\xc7\x90\xc5\xf4' Little Endian: b'\\\xd5\x00\xae8\xbb\x90\xc7\xf4\xc5' 비정상 디코딩: 峕®㢻郇 정상 디코딩: 한글문자열
[참고]
- 잇플, “한 권으로 개발자가 원하던 파이썬 심화 A to Z”, 2019.11