[파이썬] 문자열 클래스

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

콘텐츠 사용 시 출처 표기 부탁 드리고, 궁금한 점이나 의견은 댓글 남겨주세요^^