국제화 함수

국제화 함수 (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 같은 패키지)를 얹어 쓰는 것도 방법이에요.

더 알아보기