Kaldırmak non-utf8 karakter dizesinden
Düzgün görüntüleme değil bir dizi, non-utf8 karakter çıkarma ile ilgili bir sorun yaşıyorum ben. Karakterler böyle 0x97 0x61 0x6C 0x6F (hex)
Bunları kaldırmak için en iyi yolu nedir? Düzenli ifade ya da başka bir şey ?
CEVAP
Düzenli bir yaklaşım kullanarak
$regex = <<<'END'
/
(
(?: [\x00-\x7F] # single-byte sequences 0xxxxxxx
| [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
| [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2
| [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3
){1,100} # ...one or more times
)
| . # anything else
/x
END;
preg_replace($regex, '$1', $text);
UTF-8 dizileri arar ve grup 1 içine bu yakalar. Ayrıca, UTF-8 bir dizi bir parçası olarak tespit edilememiş tek bayt maçlar, ama o yakalamak değil. Yedek 1. grup içine çekilen her neyse. Bu etkin bir şekilde tüm geçersiz bayt kaldırır.
Olası bir dize onarmak için, UTF-8 karakter olarak geçersiz bayt kodlama. Ama eğer hataları rasgele ise, bu tuhaf semboller bırakabilir.
$regex = <<<'END'
/
(
(?: [\x00-\x7F] # single-byte sequences 0xxxxxxx
| [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
| [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2
| [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3
){1,100} # ...one or more times
)
| ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111
| ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111
/x
END;
function utf8replacer($captures) {
if ($captures[1] != "") {
// Valid byte sequence. Return unmodified.
return $captures[1];
}
elseif ($captures[2] != "") {
// Invalid byte of the form 10xxxxxx.
// Encode as 11000010 10xxxxxx.
return "\xC2".$captures[2];
}
else {
// Invalid byte of the form 11xxxxxx.
// Encode as 11000011 10xxxxxx.
return "\xC3".chr(ord($captures[3])-64);
}
}
preg_replace_callback($regex, "utf8replacer", $text);
DÜZENLEME:
!empty(x)
boş olmayan değerler ("0"
boş kabul edilir) maç olacak.x != ""
boş olmayan değerleri,"0"
dahil olmak üzere maç olacak.x !== ""
""
dışında bir şey maç olacak.
x != ""
en uygun olanı bu durumda kullanmak gibi görünüyor.
Ayrıca bu maç biraz hızlandırdı. Ayrı ayrı her karakter eşleştirme yerine, UTF-8, geçerli bir karakter dizisi ile eşleşir.
T-SQL bir dizesinde son karakter kaldı...
Kaldırmak için bir Javascript dize gel...
Karakter isimleri sabit değildir Neden...
Nasıl git deposundan kökenli kaldırmak...
() jQuery slideUp.() Kaldır't sli...