PHP는 결함이 많은 언어이다. 인정할 수 밖에 없다. 한편 워드프레스 개발이라는 생업을 위해 나는 PHP를 사용할 수 밖에 없고, 고로 내게 있어 PHP는 애증의 존재이다.
어제 한글날 잠시 코딩을 하다가 다시 한 번 뒷통수를 세게 맞았다. 이 일을 작게 기록한다.
워드프레스 관리자 화면 > 설정 > 날짜 표시 형식 란에 보면 보통 이렇게 되어 있을 것이다. 대개 한국어 사용중이면 이렇게 나올 것이다.
일반적인 사용자는 이걸로 문제 없을 거다. 그런데 잘 보면 Y<년>, j<일>인데 유독 월만 ‘F’이다. ‘월’이란 문자가 없다. 이것은 이유가 있다. 서양권엔 월에 숫자가 아닌 이름을 붙여 부르는 경우가 보통이기 때문이다. 그러므로 워드프레스 사용 언어를 영어로 지정하면 ‘F’가 ’10월’이 아니라 ‘October’로 해석된다.
흔히 프로그램 할 때 한국어 문화권에 있는 나는 ‘Y-m-d H:i:s’ 혹은 ‘%Y-%m-%d %H:%M:%S’를 자주 썼기 때문에 저렇게 ‘F’라는 형식 문자열을 쓸 일이 거의 없어 생소했다. 그리고 PHP에서 ‘F’로 쓰더라도 날짜 객체를 제대로 문자열로 출력하고, 또 문자열을 날짜 객체로 해석할 줄 알았다.
그러나 그게 아니었다. 다시 말하듯 PHP는 결함이 많은 언어다. 거의 같은 역할을 하는 코드를 파이썬과 PHP에서 작성해 봤다.
#!/usr/bin/env python3 from locale import setlocale, LC_TIME from datetime import datetime setlocale(LC_TIME, 'ko_KR.UTF-8') 한글날 = datetime(2019, 10, 9) 형식 = '%Y년 %B %d일' 문자열 = '2019년 10월 9일' print(datetime.strftime(한글날, 형식)) print(datetime.strptime(문자열, 형식)) """ 실행결과: 2019년 10월 09일 2019-10-09 00:00:00 """
#!/usr/bin/env php <?php setlocale(LC_TIME, 'ko_KR.UTF-8'); $한글날 = new Datetime('2019-10-9'); $형식 = '%Y년 %B %d일'; $문자열 = '2019년 10월 9일'; var_dump(strftime($형식, $한글날->getTimestamp())); var_dump(strptime($형식, $문자열)); /* 실행결과: /home/changwoo/date.php:9: string(19) "2019년 10월 09일" /home/changwoo/date.php:10: bool(false) */
파이썬과 PHP의 결과가 다르다. 파이썬은 정확하게 동작한다. 그러나 PHP는 날짜 객체를 문자열로 변환하는 건 문제가 없는데, 문자열을 날짜 객제로 제대로 변환하지 못한다. ‘F’를 제대로 해석하지 못하기 때문이다.
찾아보면 워드프레스에서는 date_i18n()이라는 함수에서 이런 여지가 있는 형식 문자열에 대해서는 별도로 코드 처리해서 제대로 로케일 처리를 한다. 아, 뭐 이런…
추가. PHP: 잘못된 디자인의 프랙탈이라는 유명한 PHP를 까는 글이 있다. 혹시 여기에 이미 언급된 적 있나 싶어서 훑어봤지만 여기엔 없어 보인다. 하루쯤 지나 다시 보니 뭐 워낙 결함이 많은 언어니 이제 하나 더 발견해도 그렇게까지 놀랄 일일까 생각도 든다.