국제화 함수 (Internationalization, Intl)
ICU(International Components for Unicode) 라이브러리를 PHP에서 사용할 수 있게 해 주는 확장이에요. 로케일 인식 포맷팅, 정렬(collation), 문자 변환(transliteration), 달력·시간대 처리 등 국제화에 필요한 다양한 기능을 제공합니다.
출처: PHP: Internationalization Functions - Manual
본문
국제화 확장(이하 Intl)은 ICU 라이브러리의 래퍼(wrapper)로, PHP 프로그래머가 다양한 로케일 인식(locale-aware) 작업을 수행할 수 있게 해 줍니다. 여기에는 포맷팅, 문자 변환(transliteration), 인코딩 변환, 달력 연산, UCA 준수 정렬, 텍스트 경계 찾기, 로케일 식별자·시간대·그래핌(graphemes) 다루기 등이 포함되지만 여기에 국한되지는 않아요.
Intl은 ICU API를 밀접하게 따르기 때문에, C/C++나 Java에서 ICU를 다뤄 본 경험이 있는 사람이라면 PHP API를 쉽게 사용할 수 있어요. 또 그 덕분에 다양한 ICU 함수를 이해하는 데 ICU 문서가 그대로 유용하게 쓰입니다.
구성 모듈
Intl은 여러 모듈로 구성되어 있으며, 각 모듈은 대응하는 ICU API를 드러냅니다.
- Collator — 적절한 로케일 민감 정렬 순서를 지원하는 문자열 비교 기능 제공
- Number Formatter — 로컬라이즈된 형식이나 주어진 패턴·규칙 집합에 따라 숫자를 표시하고, 문자열을 숫자로 파싱
- Message Formatter — 주어진 패턴과 로케일 규칙에 따라 형식화된 데이터(숫자·날짜 등)를 담은 메시지 생성, 메시지에서 데이터를 추출하는 파싱. 복수형, 로케일 인식 숫자, 통화, 조건부 등을 처리할 수 있어요
- Normalizer — 텍스트를 유니코드 정규화 형식 중 하나로 변환하는 함수와, 주어진 문자열이 이미 정규화됐는지 검사하는 루틴 제공
- Locale — 로케일 식별자에서 서브태그를 가져오고, 로케일 식별자를 파싱·구성·매칭(lookup, filter)하는 함수로 로케일 식별자와 상호작용
- Calendar — 로케일 인식 달력 연산에 쓰는 클래스 제공 (선택한 로케일의 시간대, 주의 첫 요일, DST 여부 등 다양한 정보를 얻을 수 있음)
- Timezone — 전 세계 모든 시간대 정보가 담긴 "Olson" 데이터베이스 주변의 래퍼 제공
- Date formatter — 로컬라이즈된 형식이나 주어진 패턴·규칙 집합에 따라 날짜·시간을 표시하고, 문자열을 날짜·시간으로 파싱
- Transliterator — 다양한 언어의 문자열을 라틴(latin) 표현으로 가져올 수 있게 해 줌
참고: PHP 8.4.0부터 Intl 객체의 clone이 수행될 수 없을 때 일관되게 Error가 발생합니다. 그 전에는 대부분의 클래스가 Exception을 던졌고, Spoofchecker는 치명적 오류(fatal error)를 일으켰어요.
Intl 활용 시 유용한 링크로는 ICU 문서(기타), ICU 사용자 가이드, 유니코드 정렬 알고리즘(UCA)이 있어요.
주요 클래스와 메서드
Intl에는 클래스가 아주 많아요. 각 클래스별로 대표 메서드를 정리할게요.
Collator (문자열 비교·정렬)
| 메서드 |
설명 |
Collator::asort |
인덱스 연관을 유지하며 배열 정렬 |
Collator::compare |
두 유니코드 문자열 비교 |
Collator::create |
콜레이터 생성 |
Collator::getAttribute |
정렬 속성 값 가져옴 |
Collator::getErrorCode |
콜레이터의 마지막 오류 코드 |
Collator::getErrorMessage |
콜레이터의 마지막 오류 코드 텍스트 |
Collator::getLocale |
콜레이터의 로케일 이름 |
Collator::getSortKey |
문자열의 정렬 키 |
Collator::getStrength |
현재 정렬 강도 |
Collator::setAttribute |
정렬 속성 설정 |
Collator::setStrength |
정렬 강도 설정 |
Collator::sort |
지정한 콜레이터로 배열 정렬 |
Collator::sortWithSortKeys |
콜레이터와 정렬 키로 배열 정렬 |
NumberFormatter (숫자 포맷·파싱)
| 메서드 |
설명 |
NumberFormatter::create |
숫자 포맷터 생성 |
NumberFormatter::format |
숫자 포맷 |
NumberFormatter::formatCurrency |
통화 값 포맷 |
NumberFormatter::getAttribute |
속성 가져옴 |
NumberFormatter::getErrorCode |
포맷터의 마지막 오류 코드 |
NumberFormatter::getErrorMessage |
포맷터의 마지막 오류 메시지 |
NumberFormatter::getLocale |
포맷터 로케일 |
NumberFormatter::getPattern |
포맷터 패턴 |
NumberFormatter::getSymbol |
심볼 값 |
NumberFormatter::getTextAttribute |
텍스트 속성 |
NumberFormatter::parse |
숫자 파싱 |
NumberFormatter::parseCurrency |
통화 숫자 파싱 |
NumberFormatter::setAttribute |
속성 설정 |
NumberFormatter::setPattern |
패턴 설정 |
NumberFormatter::setSymbol |
심볼 설정 |
NumberFormatter::setTextAttribute |
텍스트 속성 설정 |
Locale (로케일 식별자)
| 메서드 |
설명 |
Locale::acceptFromHttp |
HTTP "Accept-Language" 헤더 기반 최선 로케일 찾기 |
Locale::addLikelySubtags |
로케일에 가능성 있는 서브태그 추가 |
Locale::canonicalize |
로케일 문자열 정규화 |
Locale::composeLocale |
올바른 순서와 구분자로 로케일 ID 구성 |
Locale::filterMatches |
언어 태그 필터가 로케일과 매치하는지 |
Locale::getAllVariants |
입력 로케일의 변형(variants) 가져옴 |
Locale::getDefault |
INTL 전역 'default_locale'의 기본 로케일 값 |
Locale::getDisplayLanguage |
언어의 로컬라이즈된 표시 이름 |
Locale::getDisplayName |
로케일의 로컬라이즈된 표시 이름 |
Locale::getDisplayRegion |
지역의 로컬라이즈된 표시 이름 |
Locale::getDisplayScript |
스크립트의 로컬라이즈된 표시 이름 |
Locale::getDisplayVariant |
변형의 로컬라이즈된 표시 이름 |
Locale::getKeywords |
입력 로케일의 키워드 |
Locale::getPrimaryLanguage |
입력 로케일의 주 언어 |
Locale::getRegion |
입력 로케일의 지역 |
Locale::getScript |
입력 로케일의 스크립트 |
Locale::isRightToLeft |
로케일이 오른쪽에서 왼쪽(RTL) 문자 체계를 쓰는지 |
Locale::lookup |
언어 태그 목록에서 최선 매치 검색 |
Locale::minimizeSubtags |
로케일에서 가능성 있는 서브태그 제거 |
Locale::parseLocale |
로케일 ID 서브태그 요소의 키-값 배열 반환 |
Locale::setDefault |
기본 런타임 로케일 설정 |
Normalizer (유니코드 정규화)
| 메서드 |
설명 |
Normalizer::getRawDecomposition |
주어진 UTF-8 인코딩 코드 포인트의 Decomposition_Mapping 속성 |
Normalizer::isNormalized |
문자열이 지정한 정규화 형식으로 이미 정규화됐는지 |
Normalizer::normalize |
입력 정규화 후 정규화된 문자열 반환 |
MessageFormatter (패턴 메시지)
| 메서드 |
설명 |
MessageFormatter::create |
새 메시지 포맷터 생성 |
MessageFormatter::format |
메시지 포맷 |
MessageFormatter::formatMessage |
빠른 메시지 포맷 |
MessageFormatter::getErrorCode |
마지막 작업의 오류 코드 |
MessageFormatter::getErrorMessage |
마지막 작업의 오류 텍스트 |
MessageFormatter::getLocale |
포맷터가 생성된 로케일 |
MessageFormatter::getPattern |
포맷터가 사용하는 패턴 |
MessageFormatter::parse |
패턴에 따라 입력 문자열 파싱 |
MessageFormatter::parseMessage |
빠른 입력 문자열 파싱 |
MessageFormatter::setPattern |
패턴 설정 |
IntlCalendar (로케일 인식 달력)
| 메서드 |
설명 |
IntlCalendar::add |
필드에 (부호 있는) 시간 양 추가 |
IntlCalendar::after |
객체의 시간이 전달된 객체의 시간보다 뒤인지 |
IntlCalendar::before |
객체의 시간이 전달된 객체의 시간보다 앞인지 |
IntlCalendar::clear |
필드 또는 모든 필드 지우기 |
IntlCalendar::createInstance |
새 IntlCalendar 생성 |
IntlCalendar::equals |
두 객체의 시간이 같은지 비교 |
IntlCalendar::fieldDifference |
주어진 시간과 객체 시간의 차이 계산 |
IntlCalendar::fromDateTime |
DateTime 객체 또는 문자열에서 IntlCalendar 생성 |
IntlCalendar::get |
필드 값 가져옴 |
IntlCalendar::getActualMaximum |
객체의 현재 시간을 고려한 필드의 최대값 |
IntlCalendar::getActualMinimum |
객체의 현재 시간을 고려한 필드의 최소값 |
IntlCalendar::getAvailableLocales |
데이터가 있는 로케일 배열 |
IntlCalendar::getFirstDayOfWeek |
달력 로케일의 주의 첫 요일 |
IntlCalendar::getTimeZone |
객체의 시간대 |
IntlCalendar::getType |
달력 타입 |
IntlCalendar::inDaylightTime |
객체의 시간이 DST인지 |
IntlCalendar::isLenient |
날짜/시간 해석이 관대(lenient) 모드인지 |
IntlCalendar::isWeekend |
특정 날짜/시간이 주말인지 |
IntlCalendar::roll |
더 상위 필드로 넘기지 않고 필드 값 추가 |
IntlCalendar::set |
시간 필드 또는 여러 공통 필드 설정 |
IntlCalendar::setDate |
날짜 필드 설정 |
IntlCalendar::setDateTime |
날짜·시간 필드 설정 |
IntlCalendar::setLenient |
날짜/시간 해석의 관대 여부 설정 |
IntlCalendar::setTime |
epoch 이후 밀리초로 달력 시간 설정 |
IntlCalendar::setTimeZone |
달력이 사용하는 시간대 설정 |
IntlCalendar::toDateTime |
IntlCalendar를 DateTime 객체로 변환 |
IntlGregorianCalendar (그레고리력)
| 메서드 |
설명 |
IntlGregorianCalendar::createFromDate |
날짜에서 인스턴스 생성 |
IntlGregorianCalendar::createFromDateTime |
날짜·시간에서 인스턴스 생성 |
IntlGregorianCalendar::getGregorianChange |
그레고리력 변경 날짜 |
IntlGregorianCalendar::isLeapYear |
주어진 연도가 윤년인지 |
IntlGregorianCalendar::setGregorianChange |
그레고리력 변경 날짜 설정 |
IntlTimeZone (시간대)
| 메서드 |
설명 |
IntlTimeZone::countEquivalentIDs |
주어진 ID를 포함하는 등가 그룹의 ID 수 |
IntlTimeZone::createDefault |
호스트의 기본 시간대 새 복사본 생성 |
IntlTimeZone::createEnumeration |
주어진 국가 또는 오프셋과 연결된 시간대 ID 열거 |
IntlTimeZone::createTimeZone |
주어진 ID의 시간대 객체 생성 |
IntlTimeZone::fromDateTimeZone |
DateTimeZone에서 시간대 객체 생성 |
IntlTimeZone::getCanonicalID |
정규 시스템 시간대 ID 또는 정규화된 사용자 정의 시간대 ID |
IntlTimeZone::getDisplayName |
사용자에게 보여줄 시간대 이름 |
IntlTimeZone::getDSTSavings |
로컬 표준 시간에 더할 DST 시간 |
IntlTimeZone::getGMT |
GMT(UTC) 시간대 생성 |
IntlTimeZone::getIanaID |
시간대 식별자를 IANA 동등물로 변환 |
IntlTimeZone::getID |
시간대 ID |
IntlTimeZone::getIDForWindowsID |
Windows 시간대를 시스템 시간대로 변환 |
IntlTimeZone::getOffset |
주어진 순간의 raw GMT 오프셋 가져옴 |
IntlTimeZone::getRawOffset |
raw GMT 오프셋(DST 고려 전) |
IntlTimeZone::getTZDataVersion |
ICU가 사용하는 시간대 데이터 버전 |
IntlTimeZone::getWindowsID |
시스템 시간대를 Windows 시간대로 변환 |
IntlTimeZone::hasSameRules |
다른 존과 규칙·오프셋이 같은지 |
IntlTimeZone::toDateTimeZone |
DateTimeZone 객체로 변환 |
IntlTimeZone::useDaylightTime |
이 시간대가 DST를 쓰는지 |
IntlDateFormatter (날짜·시간 포맷)
| 메서드 |
설명 |
IntlDateFormatter::create |
날짜 포맷터 생성 |
IntlDateFormatter::format |
날짜/시간 값을 문자열로 포맷 |
IntlDateFormatter::formatObject |
객체 포맷 |
IntlDateFormatter::getCalendar |
달력 타입 |
IntlDateFormatter::getDateType |
datetype |
IntlDateFormatter::getErrorCode |
마지막 작업 오류 코드 |
IntlDateFormatter::getErrorMessage |
마지막 작업 오류 텍스트 |
IntlDateFormatter::getLocale |
포맷터가 사용하는 로케일 |
IntlDateFormatter::getPattern |
패턴 |
IntlDateFormatter::getTimeType |
timetype |
IntlDateFormatter::parse |
문자열을 타임스탬프 값으로 파싱 |
IntlDateFormatter::setCalendar |
달력 타입 설정 |
IntlDateFormatter::setLenient |
파서의 관대함 설정 |
IntlDateFormatter::setPattern |
패턴 설정 |
IntlDateFormatter::setTimeZone |
시간대 설정 |
그 외 유용한 클래스
- ResourceBundle — 리소스 번들에서 데이터 읽기(
count, get, getLocales 등)
- Spoofchecker — 문자열이 혼동될 수 있는지, 의심스러운 문자를 포함하는지 검사
- Transliterator — 문자열 변환(transliteration) (
transliterate, create, listIDs 등)
- IntlBreakIterator / IntlRuleBasedBreakIterator / IntlCodePointBreakIterator — 문자·단어·문장·줄 경계 이터레이터
- UConverter — 문자 집합 변환
- IntlDatePatternGenerator — 가장 적합한 날짜/시간 패턴 결정
- IntlListFormatter — 항목 목록 포맷
- IntlException — intl 오류용 예외 클래스
- IntlIterator — Intl 이터레이터 공통 인터페이스
그래핌 함수 (Grapheme Functions)
문자열을 그래핌(grapheme) 단위(사람이 인식하는 문자 하나)로 다루는 함수예요.
| 함수 |
설명 |
grapheme_extract |
UTF-8 인코딩 텍스트 버퍼에서 기본 그래핌 클러스터 시퀀스 추출 |
grapheme_levenshtein |
그래핌 단위로 두 문자열의 Levenshtein 거리 계산 |
grapheme_str_split |
문자열을 배열로 분할 |
grapheme_stripos |
대소문자 무시 문자열의 첫 등장 위치(그래핌 단위) |
grapheme_stristr |
대소문자 무시 needle 첫 등장부터 끝까지 반환 |
grapheme_strlen |
그래핌 단위 문자열 길이 |
grapheme_strpos |
문자열 첫 등장 위치(그래핌 단위) |
grapheme_strripos |
대소문자 무시 마지막 등장 위치(그래핌 단위) |
grapheme_strrpos |
마지막 등장 위치(그래핌 단위) |
grapheme_strstr |
needle 첫 등장부터 끝까지 반환 |
grapheme_substr |
문자열의 일부 반환 |
IDN 함수
| 함수 |
설명 |
idn_to_ascii |
도메인 이름을 IDNA ASCII 형식으로 변환 |
idn_to_utf8 |
도메인 이름을 IDNA ASCII에서 유니코드로 변환 |
IntlChar
Unicode 코드 포인트 관련 정적 메서드를 모아 둔 클래스예요. 예를 들어 IntlChar::isalpha(), IntlChar::isdigit(), IntlChar::tolower(), IntlChar::chr(), IntlChar::ord()처럼 한 문자에 대해 유니코드 속성을 묻거나 변환합니다.
intl 함수
전역 오류 처리용 함수예요.
| 함수 |
설명 |
intl_error_name |
주어진 오류 코드의 상징적 이름 |
intl_get_error_code |
마지막 오류 코드 |
intl_get_error_message |
마지막 오류 설명 |
intl_is_failure |
주어진 오류 코드가 실패를 나타내는지 |
Intl은 저수준이라 기능이 많지만, 숫자·날짜·통화·복수형·목록·로케일 이름 포맷 같은 공통 작업에 더 실용적인 고수준 인터페이스(예: ICU/intl 기반의 Cosmo 같은 패키지)를 얹어 쓰는 것도 방법이에요.
더 알아보기