Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 stringprep 모듈 완벽 가이드 – 인터넷 전송용 유니코드 문자열 준비하기

stringprep 모듈이란 무엇일까요?

인터넷에서 서로 다른 대상을 식별하려면 각 식별자를 비교해 동일한지 확인하는 절차가 반드시 필요합니다. 이때 비교 방식은 응용 분야에 따라 달라질 수 있습니다. 예를 들어 어떤 데이터는 대소문자를 구분하지 않고 비교해야 하기도 하는데, 이런 규칙을 적용해 문자열을 검사할 때 stringprep 모듈이 사용됩니다.

RFC 3454는 유니코드 문자열을 네트워크를 통해 전송하기 전에 사전에 준비(prepare)하는 표준 절차를 정의하고 있습니다. 이 준비 과정을 거친 문자열은 일관되게 정규화된 형태를 갖게 되므로, 송신 측과 수신 측이 동일한 기준으로 문자열을 비교할 수 있습니다.

테이블과 프로파일의 개념

RFC는 여러 개의 테이블 집합을 정의하며, 이 테이블들을 조합하여 프로파일(profile)을 구성할 수 있습니다. 대표적인 stringprep 프로파일로 nameprep이 있으며, nameprep은 국제화 도메인 이름(IDN, Internationalized Domain Names)을 처리할 때 활용됩니다.

stringprep의 테이블은 크게 두 가지 종류로 나뉩니다.

  • 셋(Set) 테이블: 특정 문자가 해당 집합에 포함되어 있으면 true를, 포함되어 있지 않으면 false를 반환합니다.
  • 매핑(Mapping) 테이블: 키(문자)를 전달하면 그에 연결된 값을 반환합니다.

모듈 임포트 방법

stringprep 모듈을 사용하려면 먼저 코드 상단에서 모듈을 임포트해야 합니다.

import stringprep

stringprep 주요 테이블 함수 정리

아래 표는 stringprep 모듈에서 제공하는 19개의 테이블 검사 함수를 정리한 것입니다. 모든 함수는 코드 포인트(code point)를 인자로 받아 해당 테이블에 포함되는지 여부 또는 매핑 결과를 반환합니다.

번호함수 및 설명
1stringprep.in_table_a1(code)
유니코드 3.2에서 할당되지 않은(unassigned) 코드 포인트
2stringprep.in_table_b1(code)
일반적으로 아무 값으로도 매핑되지 않는(commonly mapped to nothing) 문자
3stringprep.in_table_b2(code)
테이블 B.2의 매핑 값을 반환합니다. NFKC 케이스 폴딩(case-folding)에 사용되는 매핑입니다.
4stringprep.in_table_b3(code)
정규화(normalization) 없이 케이스 폴딩만 수행하는 매핑
5stringprep.in_table_c11(code)
ASCII 공백 문자
6stringprep.in_table_c12(code)
비 ASCII(non-ASCII) 공백 문자
7stringprep.in_table_c11_c12(code)
ASCII 공백 문자와 비 ASCII 공백 문자의 조합
8stringprep.in_table_c21(code)
ASCII 제어(control) 문자
9stringprep.in_table_c22(code)
비 ASCII 제어 문자
10stringprep.in_table_c21_c22(code)
ASCII 제어 문자와 비 ASCII 제어 문자의 조합
11stringprep.in_table_c3(code)
전용 용도(private use)로 지정된 문자
12stringprep.in_table_c4(code)
문자가 아닌(non-character) 코드 포인트
13stringprep.in_table_c5(code)
서러게이트(surrogate) 코드
14stringprep.in_table_c6(code)
일반 텍스트(plain text)에 부적합한 문자
15stringprep.in_table_c7(code)
정규(canonical) 표현에 부적합한 문자
16stringprep.in_table_c8(code)
표시(display) 속성 변경 관련 코드
17stringprep.in_table_c9(code)
태깅(tagging) 문자
18stringprep.in_table_d1(code)
'R' 또는 'AL' 양방향(bidirectional) 속성을 가진 문자
19stringprep.in_table_d2(code)
'L' 양방향 속성을 가진 문자

예제 코드

import stringprep as sp

print(' ')                    # 공백 문자 출력
print(sp.in_table_c11(' '))  # ASCII 공백 문자 테이블에 포함됨
print(sp.in_table_d2('L'))      # 문자 L은 좌→우(L) 양방향 속성을 가짐
print(sp.in_table_d1('L'))      # 문자 L은 우→좌(R/AL) 양방향 속성이 없음

실행 결과

True
True
False

첫 번째 print 문은 눈에 보이지 않는 공백 문자( )를 출력하므로 결과 화면에는 별도의 줄로 나타나지 않습니다. 그 뒤로 공백 문자가 ASCII 공백 테이블(c11)에 포함되어 true, 문자 'L'이 d2 테이블에 포함되어 true, d1 테이블에는 포함되지 않아 false가 순서대로 출력됩니다.