유니코드 텍스트 정렬하기

매일 공부(ML)·2022년 11월 24일
0

Fluent Python

목록 보기
24/130

텍스트와 바이트

유니코드 텍스트 정렬하기

파이썬은 각 시퀀스 안에 들어 있는 항목들을 하나하나 비교하여 어떤 자료형의 시퀀스도 설명할 수 있고, 문자열의 경우에는 각 단어의 코드 포인트를 비교한다. 바이스키 문자를 사용하는 경우 부적절한 결과가 발생할 수 있다.

fruits = ['caju','atemoia','caja','acerola']
sorted(fruits)

정렬 규칙은 현지 언어에 따라 달라지고, 포르투칼어 등 라틴 알파벳을 사용하는 언어에서는 정렬할 때 악센트와 갈고리형 기호가 거의 영향을 미치지 않습니다.


바이스키 텍스트는 locale.strxfrm() 함수를 이용해서 변환하는 것으로 locale 모듈 문서에 따르면 strfrm()함수는 문자열을 현지어와 비교하여 사용할 수 있는 문자열로 변환

locale.strxfrm() 함수를 활성화하기 위해선 적절한 현지어를 설정해야 한다.

#정렬할 때는 locale.strxfrm() 함수를 키로 사용하기 전에 setlocale(LC_COLLATE, <지역_언어>)를 호출한다.
import locale
locale.setlocale(locale.LC_COLLATE, 'pt_BR.UTF-8')
fruits = ['caju','atemoia','caja','acerola']
sorted_fruits =  sorted(fruits, key=locale.strxfrm)
sorted_fruits

유니코드 대조 알고리즘을 이용한 정렬

장고에 다양한 기여를 하고 있는 제임스토버도 유니코드 대조 알고리즘을 순수 파이썬으로 구현한 PyUCA를 만들었다.

import pyuca
coll = pyuca.Collator()
fruits = ['caju','atemoia','caja','acerola']
sorted_fruits =  sorted(fruits, key=locale.strxfrm)

PyUCA는 지역 정보를 고려하지 않으므로, 정렬 방식을 커스터마이즈하려면 Collator() 생성자에 직접 만든 대조 테이블에 경로를 제공하면 되고, 기본적으로 프로젝트와 함께 제공된다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글