JAVA

[JAVA] JAVA EMOJI PARSER / 이모지 제거 라이브러리의 한계와 극복하기 / 제로너비결합자(ZWJ) / 변형선택기의 함정 / 이모지의 결합

예나부기 2022. 3. 3.

이모지 제거 라이브러리의 한계가 드러나고 말았다.

 

이모지...................................

 

저번 포스팅을 보면 알 수 있듯이 기존의 방법은, 

 

이모지를 바이트 크기로 1차 걸러냄 > 이모지 라이브러리를 통해 2차로 파싱함 

 

이였다. 

 

하지만, 2차에 걸친 이모지 필터링에도 또 허점이 드러나고 말았는데,

 

이모지 라이브러리의 한계

1) 최근 버전의 라이브러리라고 할지라도, 이모지가 새로 생겨나는 속도를 따라가지 못함

2) 이모지의 확장으로 인한 폭 없는 접합자(zero width joiner, ZWJ)/ 변형 선택기(variation selectors)의 등장

 >이모지를 DB에 저장할 때와 쿼리로 조회할 때 값이 계속 달라지고, 앞에 물음표가 붙는 경우가 생겨
 정상적으로 조회가 되지 않았는데, 눈에 보이지는 않지만 분명 존재하는 이 녀석들의 영향이였다.

 라이브러리에서는 이들을 파싱해주지 않는다. 깨진 상태로 저장한다.


이모지의 확장


🤼‍♀️ (레슬링하는 여자) 이모지는  = 🤼 (레슬링하는 사람) + ♀️ (여성 기호) 로 이루어진다.

🤼‍♂ (레슬링하는 남자) 이모지는 = 🤼 (레슬링하는 사람) +  (남성 기호) 로 이루어진다.

 

이 때 사용되는 것이 폭 없는 접합자(zero width joiner, ZWJ)와  변형 선택기(variation selectors)이다.

 

1. Zero Width Joiner / 폭 없는 접합자(제로 너비 결합자)

-ZWJ (zero-width joiner)는 두 개 이상의 문자를 결합하여 새 문자 또는 이모티콘을 형성 할 수있는 유니 코드 문자-유니 코드 코드 포인트는 U+200D
-새 이모지를 만드는 데 사용할 수 있지만 이모지 자체는 아님
-단독으로 사용하면 보이지 않음

 

2. 변형 선택기 (variation selectors)

-이전 문자가 이모티콘 스타일로 표시되도록 지정하는 유니 코드 문자

-기본적으로 이전 문자가 텍스트 스타일로 표시되는 경우에만 필요

-유니 코드 코드 포인트는 U+FE0F
-항상 다른 이모 지 다음에 사용
-단독으로 사용하면 보이지 않음
-기본적으로 텍스트 (흑백)로 표시됩니다.

 

 

이들에 숨어있는 함정은,

 

호환성이 좋은 일부 플랫폼에서는 🤼‍♂ 단일 이모티콘으로 표시되지만

호환성이 좋지 않은 일부 플랫폼에서는 🤼♂ 와 같이 여러 개의 이모티콘이 함께 표시 될 수도 있다는 것이다.

 

이모지 데이터 조회에 문제가 있다면, 이들을 의심해봐야 한다.

 

해결방법

이모지 라이브러리를 통하여 이모지를 파싱하더라도 필터링 되지 않는 이모지가 존재할 때,

또는 라이브러리를 써서 저장한 값 뒤에 깨지는 문자가 숨어있는 것 같을 때,
ZWJ와 변형 선택기의 유니코드를 통해 제거한다. 현재는 깔끔하게 조회가 되는 상태

 

 

참고하면 좋은 이모지 사전

https://www.emojiall.com/ko

 

홈 | EMOJI 이모티콘 사전 | EmojiAll 한국어 공식 웹 사이트

이 웹 사이트는 이모티콘 의미, 사용 예, 유니 코드 코드 포인트, 고해상도 사진, 복사 및 붙여 넣기, 이모티콘 빅 데이터 순위, 벡터 그래픽 및 동적 차트, 지능형 알고리즘 감정 분석, 그리고 이

www.emojiall.com

 

이모지 라이브러리 사용기

https://yenbook.tistory.com/69

 

[JAVA] JAVA EMOJI PARSER / 이모지 제거 라이브러리 사용법 / how to remove emoji JAVA / vdurmont 사용법

사건의발단 이모지(emoji)를 제거하는 코드에서, 기존에는 정규식과 replaceAll 함수를 사용해 이모지를 제거했었다. -그런데 이모지만 제거되어야 하는데 특수문자가 같이 필터링 됨. 문제가 된 특

yenbook.tistory.com

 

댓글