# `stringprep` — 인터넷 문자열 준비

소스 코드: Lib/stringprep.py

인터넷에서 무언가(가령 호스트 이름)를 식별할 때, 종종 그러한 식별에 대해 “동등” 비교할 필요가 있습니다. 이 비교가 실행되는 정확한 방법은 응용 프로그램 도메인에 따라 달라질 수 있습니다, 예를 들어 대/소문자를 구분하는지 그렇지 않은지. 또한 “인쇄 가능” 문자로만 구성된 식별만 허용하기 위해, 가능한 식별을 제한해야 할 수도 있습니다.

RFC 3454는 인터넷 프로토콜에서 유니코드 문자열을 “준비” 하는 절차를 정의합니다. 문자열을 전선에 전달하기 전에, 준비 절차를 통해 문자열을 처리해서 어떤 정규화된 형식을 갖도록 만듭니다. RFC는 프로파일로 결합할 수 있는 테이블 집합을 정의합니다. 각 프로파일은 사용하는 테이블과 `stringprep` 절차의 어떤 선택적 부분이 프로파일 일부인지 정의해야 합니다. `stringprep` 프로파일의 한 가지 예는 국제화된 도메인 이름에 사용되는 `nameprep`입니다.

`stringprep` 모듈은 RFC 3454의 테이블만 노출합니다. 이러한 테이블은 딕셔너리나 리스트로 표현하기에 매우 크기 때문에, 모듈은 내부적으로 유니코드 문자 데이터베이스를 사용합니다. 모듈 소스 코드 자체는 `mkstringprep.py` 유틸리티를 사용하여 생성되었습니다.

결과적으로, 이러한 테이블은 데이터 구조가 아닌 함수로 노출됩니다. RFC에는 두 종류의 테이블이 있습니다: 집합과 매핑. 집합의 경우, `stringprep`는 “특성 함수”, 즉 매개 변수가 집합 일부면 `True`를 반환하는 함수를 제공합니다. 매핑의 경우, 매핑 함수를 제공합니다: 주어진 키에 대해, 연관된 값을 반환합니다. 다음은 모듈에서 사용할 수 있는 모든 함수의 목록입니다.

stringprep.in_table_a1(code)

  code가 tableA.1(유니코드 3.2에서 지정되지 않은 코드 포인트)에 있는지 판별합니다.

stringprep.in_table_b1(code)

  code가 tableB.1(일반적으로 아무것도 매핑되지 않습니다)에 있는지 판별합니다.

stringprep.map_table_b2(code)

  tableB.2(NFKC와 함께 사용되는 케이스 폴딩용 매핑)에 따라 code의 매핑 된 값을 반환합니다.

stringprep.map_table_b3(code)

  tableB.3(정규화가 없는 케이스 폴딩용 매핑)에 따라 code의 매핑 된 값을 반환합니다.

stringprep.in_table_c11(code)

  code가 tableC.1.1(ASCII 스페이스 문자)에 있는지 판별합니다.

stringprep.in_table_c12(code)

  code가 tableC.1.2(비 ASCII 스페이스 문자)에 있는지 판별합니다.

stringprep.in_table_c11_c12(code)

  code가 tableC.1(스페이스 문자, C.1.1과 C.1.2의 합집합)에 있는지 판별합니다.

stringprep.in_table_c21(code)

  code가 tableC.2.1(ASCII 제어 문자)에 있는지 판별합니다.

stringprep.in_table_c22(code)

  code가 tableC.2.2(비 ASCII 제어 문자)에 있는지 판별합니다.

stringprep.in_table_c21_c22(code)

  code가 tableC.2(제어 문자, C.2.1과 C.2.2의 합집합)에 있는지 판별합니다.

stringprep.in_table_c3(code)

  code가 tableC.3(개인 사용)에 있는지 판별합니다.

stringprep.in_table_c4(code)

  code가 tableC.4(비문자 코드 포인트)에 있는지 판별합니다.

stringprep.in_table_c5(code)

  code가 tableC.5(대리 코드)에 있는지 판별합니다.

stringprep.in_table_c6(code)

  code가 tableC.6(일반 텍스트에는 부적절)에 있는지 판별합니다.

stringprep.in_table_c7(code)

  code가 tableC.7(규범적 표현에는 부적절)에 있는지 판별합니다.

stringprep.in_table_c8(code)

  code가 tableC.8(표시 특성 변경 또는 폐지)에 있는지 판별합니다.

stringprep.in_table_c9(code)

  code가 tableC.9(문자 태깅)에 있는지 판별합니다.

stringprep.in_table_d1(code)

  code가 tableD.1(양방향 특성이 “R”이나 “AL”인 문자)에 있는지 판별합니다.

stringprep.in_table_d2(code)

  code가 tableD.2(양방향 특성이 “L”인 문자)에 있는지 판별합니다.