모든 문자열이 utf8인지 확인해야합니다. 사용자로부터 오는 입력이 ascii와 유사하거나 utf8과 같은지 확인하는 것이 더 낫지 않습니까?PHP 입력 필터링 - ASCII 검사와 utf8 검사
//KohanaPHP
function is_ascii($str) {
return ! preg_match('/[^\x00-\x7F]/S', $str);
}
//Wordpress
function seems_utf8($Str) {
for ($i=0; $i<strlen($Str); $i++) {
if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
elseif ((ord($Str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
else return false; # Does not match any model
for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
return false;
}
}
return true;
}
나는 (안 절반 유효 UTF8/아스키 반) 100 개 문자열에 대한 몇 가지 벤치마킹을했고 is_ascii은 0.001을 취하면서 그 seems_utf8() 작업 0.011을 발견했다. 하지만 내 직감은 당신이 지불하는 것을 얻고 utf8 검사가 더 나은 선택이 될 것이라고 말하고 있습니다.
나는 다음과 같은 변환 작업을 계획하고 있습니다.
<?php
/* Example data */
$string[] = 'hello';
$string[] = 'asdfghjkl;qwertyuiop[]\zxcvbnm,./]12345657890-=+_)(*&^%$#@!';
$string[] = '';
$string[] = 'accentué';
$string[] = '»á½µÎ½Ï‰Î½ τὰ ';
$string[] = '???R??=8 ????? ++++¦??? ???2??????';
$string[] = 'hello¦ùó 5/5¡45-52ZÜ¿»'. "0x93". octdec('77'). decbin(26). "F???pp?? ??? ". '»á½µÎ½Ï‰Î½ τὰ ';
$time = microtime(true);
//Count the successes
$true = array(1 => 0, 0 => 0);
foreach($string as $s) {
$r = seems_utf8($s); //0.011
print_pre(mb_substr($s, 0, 30). ' is '. ($r ? 'UTF-8' : 'non-UTF-8'));
if(! $r) {
$e = mb_detect_encoding($s, "auto");
print_pre('Encoding: '. $e);
//Convert
$s = iconv($e, 'UTF-8//TRANSLIT', $s);
print_pre(mb_substr($s, 0, 30). ' is now '. (seems_utf8($s) ? 'valid' : 'not'). ' UTF-8');
}
}
print_pre($true);
print_pre((microtime(TRUE) - $time). ' seconds');
function print_pre() { print '<pre>'; print_r(func_get_args()); print '</pre>'; }
UTF8은 기본 US-ASCII 코드 평면에 대해 말할 때 _exactly_ ASCII와 동일합니다. – jason
예, 유효하지 않은 ASCII가 있는지 확인하는 것이 영어 이외의 인코딩을 본격적인 UTF-8에서 빠르게 호출하는 방법입니다. – Xeoncross
첫 번째 함수는 문자열이 유효한 UTF-8인지 확인하지 않습니다. – Gumbo