본문 바로가기

Encoding

[UTF-8] 4Byte UTF-8 제거하기 (utf8mb4, Emoji)


MySQL 5.0과 같이 저버전을 사용하게되면, 요즘 스마트폰에 기본으로 적용된 Emoji 문자때문에 골치 아픈 경우가 많습니다.


왜?


MySQL은 기본적으로 UTF-8이 3Byte까지만 지원하기때문에 4Byte로 구성된 Emoji와 같은 문자가 저장되면 빈 값으로 저장되거나 ?? 등으로 저장됩니다.


이를 방지하기 위해서 (정확이는 utf8mb4 타입을 적용하기 전까지 임시방편으로 ..) 

저장되지 않도록 애플리케이션단에서 제거할 필요가 있습니다.


 PHP 기준입니다.

preg_replace("/\xF0[\x90-\xBF][\x80-\xBF]{2}|

[\xF1-\xF3][\x80-\xBF]{3}|

\xF4[\x80-\x8F][\x80-\xBF]{2}/", "", $string);


오잉 이게 뭐지? 싶겠지만, 

http://docs.oracle.com/cd/E24693_01/server.11203/e10729/appunicode.htm#CACHBDGH   여기를 참고해보시면  4Byte UTF-8의 first Byte는 F0~F4로 구성되어 있습니다.

이 정보는 1~3Byte와 중복되지 않는 값으로 일종의 Key값(?)으로 생각하면 될것 같네요.


💞💞허허허💞💞 -> 허허허가 됩니다.

⛄허허 -> ⛄허허가 됩니다. 

ㄴ 으잉? 이라고 생각되겠지만 이 문자는 3Byte로 구성된 UTF-8로 없어지지 않는 것이 맞고, 저버전 MySQL도 문제없이 처리가능합니다.

- http://apps.timwhitlock.info/unicode/inspect?s=%E2%9B%84


참고된 테이블 구성 그대로 정규식으로 조합하여 4Byte UTF-8 문자를 찾아내어 ""(빈값)으로 replace합니다.



참고 사이트

- 특정 문자 구성내용 보기 

http://apps.timwhitlock.info/unicode/inspect?s=%F0%9F%92%9E


- UTF-8 구성표

http://www.utf8-chartable.de/unicode-utf8-table.pl


- http://stackoverflow.com/questions/16496554/can-php-detect-4-byte-encoded-utf8-chars


- getEmoji

http://getemoji.com/