unicodeToList
서로게이트 페어를 올바르게 처리하면서 문자열을 사람이 인식하는 문자 단위로 나눕니다.
List<String> unicodeToList(String s)
강의
Dart의 String은 문자가 아니라 UTF-16 코드 유닛의
나열입니다. s.split('')은 코드 유닛 단위로 자르기 때문에
평범한 ASCII/라틴 문자에는 문제가 없지만, 기본 다국어 평면(BMP)을 벗어난
문자, 예컨대 대부분의 이모지에서는 결과가 어긋납니다. 그런 문자는
서로게이트 페어(코드 유닛 두 개)로 표현되므로, 단순한
split은 이모지 하나를 깨진 반쪽 두 개로 찢어 놓습니다.
unicodeToList는 문자열의 .runes, 즉 유니코드
코드 포인트를 순회하면서 각각을 다시 한 글자짜리 String으로
되돌려 이 문제를 해결합니다. 결과는 사람이 문자열을 읽을 때 실제로 보는
문자들의 목록이며, UTF-16 유닛이 아니라 코드 포인트 단위로 나누는 FxTS의
unicodeToList와 동일하게 동작합니다.
데모 1 · 단순 split과 unicodeToList 비교
데모 2 · 뒤집기와 개수 세기를 제대로 하기
unicodeToList를 바탕으로 하면, 단순 split으로 뒤집었을 때
망가지던 이모지가 그대로 유지됩니다:
직접 해 보기
연습: 이 문자열에 사람이 인식하는 문자가 몇 개인지 세어 보세요 (이모지가 포함되어 있습니다).