ㅎ에서도 정확하게 is_utf8 판단하는 함수
euc-kr을 사용하게 되면 간혹 utf-8 문자인지 확인해 봐야 하는 경우가 생기곤 한다.
이때 정확하게 utf-8을 체크하면 좋을텐데... ㅎ 부분에서 그렇지 못한것을 발견하게 된다.
많이 알려진 방법들이 죄다 그렇다.
정확하게 판단하는것은 인코딩을 했다가 다시 원복했을때 같은지 판단하는 방법이 정확한데 방법은 아래와 같다.
$string = '획'; 으로 테스트 해보면 무슨 말인지 알것이다. 난 어디가지 utf-8 코드가 있고 이런것 까지 알고 싶지 않다.
분명한것은 한글코드의 뒤쪽(히흥)에서 utf-8과 겹치는 부분이 있기 때문에 이런 문제가 발생 한다는 것이다.
아래 방식은 모두 utf8로 제대로 체크 하지 못하는것들이다. 테스트를 해보면 알것이다.
$isUTF8 = preg_match('//u', $string);
$validUTF8 = ! (false === mb_detect_encoding($string, 'UTF-8', true));
$validUTF8 = ( strlen($string) === strlen(@iconv('UTF-8', 'UTF-8//IGNORE', $string)) ) ? true:false;
// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {
// From http://w3.org/International/questions/qa-forms-utf-8.html
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
} // function is_utf8