Created at : 2024-09-02 10:41
Auther: Soo.Y

2. 기본 문법 (확장)

2.7 문자열과 인코딩 (ASCII, UTF-8, CP949)

파이썬에서 문자열은 문자들의 시퀀스로, 이러한 문자는 내부적으로 특정 인코딩 방식으로 저장됩니다. 인코딩은 문자를 컴퓨터가 이해할 수 있는 이진수로 변환하는 방법입니다. 파이썬은 다양한 인코딩을 지원하며, 그 중에서도 ASCII, UTF-8, CP949와 같은 인코딩이 자주 사용됩니다. 이 섹션에서는 각 인코딩 방식의 특징과 파이썬에서의 사용 방법을 알아보겠습니다.

2.7.1 ASCII (American Standard Code for Information Interchange)

  • ASCII는 초기의 문자 인코딩 방식으로, 영어 알파벳과 일부 제어 문자들을 7비트로 표현합니다. 총 128개의 문자만을 표현할 수 있으며, 주로 영어와 같은 단순한 언어의 텍스트 표현에 사용됩니다.
  • 파이썬에서 ASCII 인코딩:
text = "Hello"
ascii_encoded = text.encode('ascii')  # 문자열을 ASCII로 인코딩
print(ascii_encoded)  # 출력: b'Hello'
  • ASCII 디코딩:
ascii_decoded = ascii_encoded.decode('ascii')  # ASCII 인코딩된 바이트를 다시 문자열로 디코딩
print(ascii_decoded)  # 출력: Hello

2.7.2 UTF-8 (8-bit Unicode Transformation Format)

  • UTF-8은 전 세계의 모든 문자를 표현할 수 있는 유니코드(Unicode) 표준의 인코딩 방식 중 하나입니다. UTF-8은 가변 길이 인코딩 방식으로, 각 문자는 1바이트에서 4바이트까지 다양한 크기로 인코딩됩니다.
  • UTF-8은 ASCII와 호환되며, 다국어 지원이 필요할 때 널리 사용됩니다. 특히 웹과 같은 환경에서 기본 인코딩 방식으로 사용됩니다.
  • 파이썬에서 UTF-8 인코딩:
text = "안녕하세요"
utf8_encoded = text.encode('utf-8')  # 문자열을 UTF-8로 인코딩
print(utf8_encoded)  # 출력: b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94'
  • UTF-8 디코딩:
utf8_decoded = utf8_encoded.decode('utf-8')  # UTF-8 인코딩된 바이트를 다시 문자열로 디코딩
print(utf8_decoded)  # 출력: 안녕하세요

2.7.3 CP949 (Code Page 949)

  • CP949는 윈도우 운영 체제에서 한글을 표현하기 위해 사용되는 문자 인코딩 방식입니다. 이는 EUC-KR의 확장형으로, 한국어와 관련된 문자들을 표현하는 데 사용됩니다. 하지만 CP949는 한국어와 관련된 문자만 지원하므로, 국제적으로는 UTF-8을 사용하는 것이 권장됩니다.
  • 파이썬에서 CP949 인코딩:
text = "안녕하세요"
cp949_encoded = text.encode('cp949')  # 문자열을 CP949로 인코딩
print(cp949_encoded)  # 출력: b'\xbe\xc8\xb3\xe7\xc7\xcf\xbc\xbc\xbf\xe4'
  • CP949 디코딩:
cp949_decoded = cp949_encoded.decode('cp949')  # CP949 인코딩된 바이트를 다시 문자열로 디코딩
print(cp949_decoded)  # 출력: 안녕하세요

2.7.4 인코딩 변환

파이썬에서는 한 인코딩 방식에서 다른 인코딩 방식으로 변환하는 것도 가능합니다. 예를 들어, CP949로 인코딩된 텍스트를 UTF-8로 변환할 수 있습니다.

  • 인코딩 변환 예시:
# CP949로 인코딩된 문자열을 UTF-8로 변환하기
text_cp949 = "안녕하세요".encode('cp949')  # CP949로 인코딩
text_utf8 = text_cp949.decode('cp949').encode('utf-8')  # 먼저 CP949를 디코딩 후, UTF-8로 다시 인코딩
print(text_utf8)  # 출력: b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94'

2.7.5 인코딩 처리에서의 주의사항

  • 디코딩 오류: 텍스트를 잘못된 인코딩으로 디코딩하려 하면 오류가 발생할 수 있습니다. 이 경우 errors 파라미터를 사용해 오류를 무시하거나 대체 문자를 지정할 수 있습니다.
try:
    print(b'\xbe\xc8\xb3\xe7\xc7\xcf\xbc\xbc\xbf\xe4'.decode('utf-8'))  # 잘못된 인코딩으로 디코딩 시도
except UnicodeDecodeError as e:
    print("디코딩 오류:", e)
  • 인코딩 설정: 텍스트 파일을 읽거나 쓸 때, 파일의 인코딩 방식을 명시하는 것이 좋습니다.
# 파일을 UTF-8로 읽기
with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()
  
# 파일을 CP949로 쓰기
with open('example_cp949.txt', 'w', encoding='cp949') as file:
    file.write(content)

이러한 인코딩 방식들을 이해하고 적절하게 사용하는 것은 다양한 언어를 처리할 수 있는 유연한 프로그램을 작성하는 데 매우 중요합니다. 각 인코딩 방식의 특징을 이해하고, 필요에 따라 적절한 인코딩을 선택하는 것이 좋습니다.

2.8 문자열 포매팅 (Print Formatting)

파이썬에서 문자열 포매팅은 변수를 포함한 문자열을 구성하는 방법을 제공합니다. 문자열 포매팅을 통해 더 유연하고 읽기 쉬운 출력을 만들 수 있습니다. 파이썬에서는 문자열을 포매팅하는 여러 가지 방법을 제공합니다. 이 섹션에서는 대표적인 세 가지 방법을 소개하겠습니다: printf 스타일 포매팅, str.format() 메서드, 그리고 f-string을 사용한 포매팅입니다.

2.8.1 printf 스타일 포매팅

C 언어의 printf 스타일 포매팅을 기반으로 하는 방식으로, % 연산자를 사용해 문자열에 변수를 삽입합니다.

  • 기본 사용법:
name = "Alice"
age = 30
print("이름: %s, 나이: %d" % (name, age))
# 출력: 이름: Alice, 나이: 30
  • 포맷 코드:
    • %s: 문자열(String)
    • %d: 정수(Integer)
    • %f: 실수(Float)
    • %x: 16진수(Hexadecimal)
height = 175.5
print("키: %.2f cm" % height)
# 출력: 키: 175.50 cm

위 예제에서 %.2f는 소수점 이하 두 자리까지 표시하라는 의미입니다.

2.8.2 str.format() 메서드

str.format() 메서드는 기존 % 스타일 포매팅의 단점을 보완하여, 더 강력하고 유연한 포매팅 방법을 제공합니다.

  • 기본 사용법:
name = "Bob"
age = 25
print("이름: {}, 나이: {}".format(name, age))
# 출력: 이름: Bob, 나이: 25
  • 인덱스와 키워드 인자 사용:
print("이름: {0}, 나이: {1}".format(name, age))
# 출력: 이름: Bob, 나이: 25
 
print("이름: {name}, 나이: {age}".format(name="Charlie", age=28))
# 출력: 이름: Charlie, 나이: 28
  • 포맷 지정자 사용:
height = 180.456
print("키: {:.1f} cm".format(height))
# 출력: 키: 180.5 cm

여기서 :.1f는 소수점 이하 한 자리까지 표시하라는 의미입니다.

2.8.3 f-string 포매팅 (파이썬 3.6+)

f-string은 파이썬 3.6에서 도입된 가장 간편하고 강력한 문자열 포매팅 방법입니다. 문자열 앞에 f를 붙이고, 중괄호 {} 안에 변수를 넣어 사용합니다.

  • 기본 사용법:
name = "David"
age = 22
print(f"이름: {name}, 나이: {age}")
# 출력: 이름: David, 나이: 22
  • 표현식 사용: f-string 내에서 표현식을 직접 사용할 수 있습니다.
print(f"{name}은 내년에 {age + 1}살이 됩니다.")
# 출력: David은 내년에 23살이 됩니다.
  • 포맷 지정자 사용:
pi = 3.14159
print(f"원주율: {pi:.2f}")
# 출력: 원주율: 3.14

2.8.4 정렬과 너비 지정

포맷팅을 사용할 때, 출력의 정렬과 너비를 지정할 수도 있습니다.

  • 왼쪽 정렬, 오른쪽 정렬, 가운데 정렬:
print(f"|{'왼쪽 정렬':<10}|{'오른쪽 정렬':>10}|{'가운데 정렬':^10}|")
# 출력: |왼쪽 정렬    |   오른쪽 정렬|  가운데 정렬 |
  • <: 왼쪽 정렬

  • >: 오른쪽 정렬

  • ^: 가운데 정렬

  • 고정 너비 지정:

number = 123
print(f"숫자: {number:5d}")
# 출력: 숫자:   123

여기서 5d는 최소 5칸의 너비를 차지하도록 정수를 출력하라는 의미입니다.

2.8.5 천 단위 구분기호 추가

큰 숫자를 포매팅할 때, 천 단위 구분기호를 넣을 수 있습니다.

  • 천 단위 구분기호 사용:
large_number = 1000000
print(f"숫자: {large_number:,}")
# 출력: 숫자: 1,000,000

2.8.6 백분율 표시

백분율을 포매팅할 때는 % 기호를 사용할 수 있습니다.

  • 백분율 포매팅:
score = 0.85
print(f"점수: {score:.2%}")
# 출력: 점수: 85.00%

여기서 :.2%는 소수점 이하 두 자리까지 백분율로 표시하라는 의미입니다.

이제 파이썬에서 문자열을 다양한 방식으로 포매팅하는 방법을 이해하게 되었습니다. 이를 통해 더 명확하고 유연한 출력을 만들어낼 수 있습니다.

관련 문서

2. 기본 문법