PHP에서 mb_detect_encoding() 함수는 문자열의 문자 인코딩을 감지하는 데 사용됩니다. 이 함수는 후보 인코딩 목록을 순서대로 검사하여 해당 문자열에 맞는 인코딩을 판별하며, PHP 4.0.6 이상 버전부터 지원됩니다.
mb_detect_encoding()은 멀티바이트(multibyte) 인코딩 환경에서 특히 유용합니다. 멀티바이트 인코딩에서는 모든 바이트 시퀀스가 유효한 문자열을 형성하지 않기 때문인데, 입력 문자열에 유효하지 않은 바이트 시퀀스가 포함되어 있으면 해당 인코딩은 거부되고 다음 후보 인코딩을 검사하게 됩니다.
구문
string mb_detect_encoding(string $string, ?string $encoding = null, bool $strict = false)
추가 정보 없이 문자 인코딩을 자동으로 감지하는 것은 완전히 신뢰할 수 없다는 점에 유의해야 합니다. 문자 인코딩 감지는 마치 암호화된 문자열을 키 없이 해독하는 것과 비슷하다고 할 수 있습니다. 따라서 데이터와 함께 저장되거나 전송되는 문자 인코딩을 명시하려면 Content-Type HTTP 헤더를 사용하는 것이 좋습니다.
매개변수
mb_detect_encoding() 함수는 다음 세 가지 매개변수를 받습니다.
$string − 인코딩을 검사할 대상 문자열입니다.
$encoding − 순서대로 시도할 문자 인코딩 목록입니다. 문자열 배열 또는 쉼표로 구분된 단일 문자열 등 원하는 형식으로 지정할 수 있습니다. 이 매개변수가 생략되거나 null이면 mbstring.detect_order 설정 옵션 또는 mb_detect_order() 함수로 지정된 현재 detect_order가 사용됩니다.
$strict − 문자열이 나열된 어떤 인코딩에서도 유효하지 않을 때의 동작을 제어합니다. strict가 false이면 가장 근접하게 일치하는 인코딩을 반환하고, true이면 false를 반환합니다.
반환 값
감지된 문자 인코딩을 반환합니다. 만약 문자열이 나열된 어떤 인코딩에서도 유효하지 않다면 false를 반환합니다.
예제 1: strict 매개변수 없이 사용하기
<?php
$string = "";
// 현재 detect_order를 기준으로 문자 인코딩 감지
echo mb_detect_encoding($string);
// auto는 mbstring.language 설정에 따라 확장됨
echo mb_detect_encoding($string, "auto");
// 인코딩 직접 지정
echo mb_detect_encoding($string, "JIS, eucjp-win, sjis-win");
// 배열로 encodings 매개변수 지정
$array_encoding = [
"ASCII",
"JIS",
"EUC-JP"
];
echo mb_detect_encoding($string, $array_encoding);
?>출력 결과
ASCIIASCIIJISASCII
예제 2: strict 매개변수 사용하기
<?php // ISO-8859-1로 인코딩된 'áéóú' $string = "\xE1\xE9\xF3\xFA"; // UTF-8이 더 근접한 일치로 간주됨 var_dump(mb_detect_encoding($string, ['ASCII', 'UTF-8'], false)); var_dump(mb_detect_encoding($string, ['ASCII', 'UTF-8'], true)); // 유효한 인코딩을 찾은 경우 strict 매개변수는 결과에 영향을 주지 않음 var_dump(mb_detect_encoding($string, ['ASCII', 'UTF-8', 'ISO-8859-1'], false)); var_dump(mb_detect_encoding($string, ['ASCII', 'UTF-8', 'ISO-8859-1'], true)); ?>
출력 결과
string(5) "UTF-8" bool(false) string(10) "ISO-8859-1" string(10) "ISO-8859-1"
위 예제에서 볼 수 있듯이, strict 모드를 활성화하면 후보 인코딩 중 정확히 일치하는 것이 없을 경우 false를 반환합니다. 반면 ISO-8859-1처럼 실제로 유효한 인코딩이 후보 목록에 포함되어 있다면 strict 여부와 관계없이 동일한 결과를 얻게 됩니다.