SORU
9 EYLÜL 2009, ÇARŞAMBA


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
9 EYLÜL 2009, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jedimasterkyle

    jedimasterky

    11 ŞUBAT 2006
  • Jimmie Jones

    Jimmie Jones

    16 Kasım 2007
  • уσ ρℓz sυв ιℓℓ sυв вαcқ

    уσ ρℓz

    14 EKİM 2010