PHP 로캘 문제

PHP는 결함이 많은 언어이다. 인정할 수 밖에 없다. 한편 워드프레스 개발이라는 생업을 위해 나는 PHP를 사용할 수 밖에 없고, 고로 내게 있어 PHP는 애증의 존재이다.

어제 한글날 잠시 코딩을 하다가 다시 한 번 뒷통수를 세게 맞았다. 이 일을 작게 기록한다.

워드프레스 관리자 화면 > 설정 > 날짜 표시 형식 란에 보면 보통 이렇게 되어 있을 것이다. 대개 한국어 사용중이면 이렇게 나올 것이다.

Y년 F j일

일반적인 사용자는 이걸로 문제 없을 거다. 그런데 잘 보면 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를 까는 글이 있다. 혹시 여기에 이미 언급된 적 있나 싶어서 훑어봤지만 여기엔 없어 보인다. 하루쯤 지나 다시 보니 뭐 워낙 결함이 많은 언어니 이제 하나 더 발견해도 그렇게까지 놀랄 일일까 생각도 든다.

댓글 남기기