Hi,
Die regular expression hat den Nachteil, dass sie so keine qualifizierte Aussage gibt, welche utf-8 Stufe erreicht wurde. Wäre schöner, wenn man das auch wüsste.
/* Ist String korrektes UTF-8? */
function valid_utf8($string) {
$result=1;
$len=strlen($string);
$i=0;
while($i<$len) {
$char=ord($string{$i++});
if(valid_1byte($char)) { // continue
continue;
} elseif(valid_2byte($char)) { // check 1 byte
if(!valid_nextbyte(ord($string{$i++}))) return FALSE;
$result=max($result,2);
} elseif(valid_3byte($char)) { // check 2 bytes
$result=max($result,3);
if(!valid_nextbyte(ord($string{$i++}))) return FALSE;
if(!valid_nextbyte(ord($string{$i++}))) return FALSE;
} elseif(valid_4byte($char)) { // check 3 bytes
$result=max($result,4);
if(!valid_nextbyte(ord($string{$i++}))) return FALSE;
if(!valid_nextbyte(ord($string{$i++}))) return FALSE;
if(!valid_nextbyte(ord($string{$i++}))) return FALSE;
} else {
return FALSE; // 10xxxxxx occuring alone
} // goto next char
}
return $result; // done
}
function valid_1byte($char) {
if(!is_int($char)) return FALSE;
return ($char & 0x80)==0x00;
}
function valid_2byte($char) {
if(!is_int($char)) return FALSE;
return ($char & 0xE0)==0xC0;
}
function valid_3byte($char) {
if(!is_int($char)) return FALSE;
return ($char & 0xF0)==0xE0;
}
function valid_4byte($char) {
if(!is_int($char)) return FALSE;
return ($char & 0xF8)==0xF0;
}
function valid_nextbyte($char) {
if(!is_int($char)) return FALSE;
return ($char & 0xC0)==0x80;
}
valid_utf8("Text") liefert 1, 2, 3, 4 oder FALSE zurück.
Gruß, Cybaer
--
Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!